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

本文关键字:转换 IReadOnlyCollection | 更新日期: 2023-09-27 17:59:14

为什么编译器在试图将不同的集合(都实现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和Visual Studio 2015。

上述情况下的编译器错误如下:

键入Queue<int>/Stack<int>/。。。不能隐式转换为CCD_ 5。存在显式转换。你是不是错过了演员阵容?

(这不是实际的文本,但我相信你不会希望我在这里复制粘贴德语文本。)

如果我做的演员

IReadOnlyCollection<int> d = new Queue<int>() as IReadOnlyCollection<int>;

甚至通过

IReadOnlyCollection<int> d = (IReadOnlyCollection<int>)new Queue<int>();

一切都很好;它没有给我任何编译或运行时错误。

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

如果您的目标是.NET 4.6或更高版本,那么它确实可以编译。

在这个版本中,SortedSet(例如)确实实现了IReadOnlyCollection(通过右键单击并选择"转到定义"进行检查)

完整列表为:

ISet<T> ,I集合<T> ,IEnumerable<T> ,IEnumerable,ICollection,ISerializable,IDeserializationCallback,IReadOnlyCollection<T>

在4.5时,它只实现:

ISet<T> ,I集合<T> ,IEnumerable<T> ,ICollection,IEnumerable,ISerializable,IDeserializationCallback

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