You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

命令行可编译的MRUCache在VS2015(.NET4.5.2)中报错的修改方案咨询

适配.NET Framework 4.5.2的MRUCache代码修改方案

问题背景

原本在Visual Studio 2022环境下可正常运行的MRUCache代码,移植到基于Visual Studio 2015、目标框架为.NET Framework 4.5.2的项目中时出现大量编译错误,核心原因是代码使用了C# 7.0及以上版本的特性,而该环境不支持这些特性。

需替换的不兼容特性

  • 值类型元组((K key, V value)):C# 7.0引入,.NET Framework 4.5.2无相关支持
  • out变量隐式声明(out var node):C# 7.0引入,需改为显式声明变量

修改后的完整代码

using System;
using System.Collections.Generic;

// 自定义缓存项类,替代C#7的元组类型
public class CacheItem<K, V>
{
    public K Key { get; set; }
    public V Value { get; set; }

    public CacheItem(K key, V value)
    {
        Key = key;
        Value = value;
    }
}

public class MRUCache<K, V>
{
    private readonly int _capacity;
    private readonly Dictionary<K, LinkedListNode<CacheItem<K, V>>> _cache;
    private readonly LinkedList<CacheItem<K, V>> _mruList;

    public MRUCache(int capacity)
    {
        _capacity = capacity;
        _cache = new Dictionary<K, LinkedListNode<CacheItem<K, V>>>();
        _mruList = new LinkedList<CacheItem<K, V>>();
    }

    public V Get(K key)
    {
        // 显式声明out参数变量,替代C#7的out var语法
        LinkedListNode<CacheItem<K, V>> node;
        if (_cache.TryGetValue(key, out node))
        {
            _mruList.Remove(node);
            _mruList.AddFirst(node);
            return node.Value.Value;
        }
        throw new KeyNotFoundException("The given key was not present in the cache.");
    }

    public void Put(K key, V value)
    {
        LinkedListNode<CacheItem<K, V>> node;
        if (_cache.TryGetValue(key, out node))
        {
            _mruList.Remove(node);
        }
        else if (_cache.Count >= _capacity)
        {
            var lastNode = _mruList.Last;
            _cache.Remove(lastNode.Value.Key);
            _mruList.RemoveLast();
        }

        var newItem = new CacheItem<K, V>(key, value);
        var newNode = new LinkedListNode<CacheItem<K, V>>(newItem);
        _mruList.AddFirst(newNode);
        _cache[key] = newNode;
    }
}

public class Program
{
    public static void Main()
    {
        var mruCache = new MRUCache<int, string>(3);
        mruCache.Put(1, "one");
        mruCache.Put(2, "two");
        mruCache.Put(3, "three");
        Console.WriteLine(mruCache.Get(1)); // Outputs: one
        mruCache.Put(4, "four"); // Evicts key 2 (most recently used is 1, 3, 4)
        try
        {
            Console.WriteLine(mruCache.Get(2)); // Throws KeyNotFoundException
        }
        catch (KeyNotFoundException e)
        {
            Console.WriteLine(e.Message);
        }
    }
}

修改关键点说明

  • 新增CacheItem<K,V>类,用于封装键值对,完全替代原代码中的值元组功能
  • 将所有out var语法改为先显式声明变量,再通过out参数传递
  • 更新字典和链表的泛型参数,替换为自定义的CacheItem<K,V>类型
  • 调整所有访问元组的key/value属性的代码,改为访问CacheItem的Key/Value属性

内容的提问来源于stack exchange,提问作者Derek Johnson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:23:10