SortedList<TKey,TValue>是否实现IReadOnlyDictionary?编译冲突问题
问题解析:为什么VS2015不允许SortedList/SortedDictionary隐式转换为IReadOnlyCollection<KeyValuePair<,>>
首先可以明确:文档和编译器都没有问题,问题出在接口实现的方式上,以及C#对显式接口实现的转换规则。
核心原因
在.NET Framework 4.6中,SortedList<TKey,TValue>和SortedDictionary<TKey,TValue>确实实现了IReadOnlyCollection<KeyValuePair<TKey,TValue>>,但这个实现是通过**显式实现ICollection<KeyValuePair<TKey,TValue>>**间接完成的(因为.NET 4.5+中ICollection<T>继承了IReadOnlyCollection<T>)。
C#的规则是:如果一个类显式实现了某个接口,那么你不能直接将该类的实例隐式转换为该接口(或其父接口)的类型——编译器不会自动推断这个转换,必须通过显式强制转换来告诉编译器你确认该类型确实实现了目标接口。
解决方法
你只需要在调用方法时添加显式强制转换即可:
private static void Main () { SortedList<int, string> listkvp = new SortedList<int, string> (); SortedDictionary<int, string> dict = new SortedDictionary<int, string> (); // 添加显式强制转换 funcIROCollKvp1 ((IReadOnlyCollection<KeyValuePair<int, string>>)listkvp); funcIROCollKvp1 ((IReadOnlyCollection<KeyValuePair<int, string>>)dict); }
额外检查点
请确保你的项目确实正确设置了目标框架为.NET Framework 4.6:
- 右键项目 → 属性 → 应用程序 → 目标框架,确认选择的是
.NET Framework 4.6(而不是更低版本,比如.NET 4.5)。如果目标框架版本低于.NET 4.5,这些类型确实不会实现IReadOnlyCollection接口,那文档的说明就不适用了。
内容的提问来源于stack exchange,提问作者Tobias Knauss
相关产品推荐
相关产品推荐

