尝试将它们转换为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


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

09-06 12:05