IReadOnlyCollection上的隐式/显式转换混淆

时间:2016-07-29 09:48:41

标签: c# visual-studio type-conversion .net-4.5 readonly-collection

为什么编译器尝试将它们转换为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>();
一切都很好;它没有给我编译或运行时错误。

1 个答案:

答案 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

如果文档另有说明,那么(我很害怕)文档是错误的。