尝试将它们转换为IReadOnlyCollection
时,为什么不同的集合(都实现了IReadOnlyCollection
接口)以不同的方式由编译器处理?
IReadOnlyCollection<int> a = new List<int>(); // everything fine
IReadOnlyCollection<int> b = new HashSet<int>(); // compiler wants me to cast
IReadOnlyCollection<int> c = new Stack<int>(); // compiler wants me to cast
IReadOnlyCollection<int> d = new Queue<int>(); // compiler wants me to cast
IReadOnlyCollection<int> e = new LinkedList<int>(); // compiler wants me to cast
IReadOnlyCollection<int> f = new SortedSet<int>(); // compiler wants me to cast
我正在使用.NET 4.5和VisualStudio 2015。
上述情况下的编译器错误是这样的:
类型
Queue<int>
/ Stack<int>
/ ...不能隐式转换为IReadOnlyCollection<int>
。存在显式转换。你想念演员吗?(这不是实际的文本,但我相信您不希望我在此处复制粘贴德语文本。)
如果我做演员
IReadOnlyCollection<int> d = new Queue<int>() as IReadOnlyCollection<int>;
甚至
IReadOnlyCollection<int> d = (IReadOnlyCollection<int>)new Queue<int>();
一切顺利;它没有任何编译或运行时错误。
最佳答案
如果您以.NET 4.6或更高版本为目标,则可以编译。
在此版本中,例如SortedSet
确实实现了IReadOnlyCollection
(通过右键单击并选择“转到定义”进行检查)。
完整列表是:
ISet ,ICollection ,IEnumerable ,IEnumerable,ICollection,ISerializable,IDeserializationCallback,IReadOnlyCollection
在4.5中,它仅实现:
ISet ,ICollection ,IEnumerable ,ICollection,IEnumerable,ISerializable,IDeserializationCallback
如果文档另有说明,那么(恐怕)文档是错误的。