2

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>();

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

4

1 回答 1

2

如果您以 .NET 4.6 或更高版本为目标,则可以编译。

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

完整名单是:

ISet<T>、ICollection<T>、IEnumerable<T>、IEnumerable、ICollection、ISerializable、IDeserializationCallback、IReadOnlyCollection<T>

在 4.5 它只实现:

ISet<T>、ICollection<T>、IEnumerable<T>、ICollection、IEnumerable、ISerializable、IDeserializationCallback

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

于 2016-07-29T10:56:01.020 回答