c# - 对 IReadOnlyCollection 的隐式/显式转换混淆

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

为什么不同的集合(都实现了 IReadOnlyCollection 接口(interface))在试图将它们变成 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> .存在显式转换。您缺少类型转换吗?

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

如果我做 Actor

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

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

关于c# - 对 IReadOnlyCollection 的隐式/显式转换混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38655671/

相关文章:

c# - Visual Studio 2012 找不到模板

Javascript [Symbol.toPrimitive](hint) 转换函数

Java:在控制台中获取字符串输入并解析为 Int

c - gcc 4.6.1 (linux) 中 long double 的问题

c# - 在 C# 中声明一个 const double[]?

c# - .NET 核心 - 依赖注入(inject)、工厂和 IDisposable

c# - 根据前缀将整数字符串解析为十进制、八进制或十六进制

c# - .NET Core 应用程序中的 .NET Framework 依赖项

c# - 使用 Visual Studio 更新 ClickOnce 提示

c# - C#错误 “Not supported by language” CS0570