命令行可编译的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
相关产品推荐
相关产品推荐

