implicit/explicit 对 IReadOnlyCollection 造成混淆
implicit/explicit cast confusion on IReadOnlyCollection
为什么不同的集合(都实现了 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<T>, ICollection<T>, IEnumerable<T>, IEnumerable, ICollection, ISerializable, IDeserializationCallback, IReadOnlyCollection<T>
在 4.5 中它只实现了:
ISet<T>, ICollection<T>, IEnumerable<T>, ICollection, IEnumerable, ISerializable, IDeserializationCallback
如果文档另有说明,那么(恐怕)文档是错误的。
为什么不同的集合(都实现了 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<T>, ICollection<T>, IEnumerable<T>, IEnumerable, ICollection, ISerializable, IDeserializationCallback, IReadOnlyCollection<T>
在 4.5 中它只实现了:
ISet<T>, ICollection<T>, IEnumerable<T>, ICollection, IEnumerable, ISerializable, IDeserializationCallback
如果文档另有说明,那么(恐怕)文档是错误的。