为什么编译器尝试将它们转换为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>();
一切都很好;它没有给我编译或运行时错误。
答案 0 :(得分:2)
如果您的目标是.NET 4.6或更高版本,则会编译。
在此版本SortedSet
(例如)确实实现IReadOnlyCollection
(通过右键单击并选择&#34;转到定义来检查)。
完整清单是:
ISet&lt; T&gt;,ICollection&lt; T&gt;,IEnumerable&lt; T&gt;,IEnumerable,ICollection,ISerializable,IDeserializationCallback,IReadOnlyCollection&lt; T&gt;
在4.5它只实现:
ISet&lt; T&gt;,ICollection&lt; T&gt;,IEnumerable&lt; T&gt;,ICollection,IEnumerable,ISerializable,IDeserializationCallback
如果文档另有说明,那么(我很害怕)文档是错误的。