【问题标题】:Cannot convert HashSet to IReadOnlyCollection无法将 HashSet 转换为 IReadOnlyCollection
【发布时间】:2015-09-24 13:27:42
【问题描述】:

我有一个 HashSet,我正在尝试将其转换为 IReadOnlyCollection,但出现错误:

无法将类型“System.Collections.Generic.HashSet”隐式转换为“System.Collections.Generic.IReadOnlyCollection”。存在显式转换(您是否缺少演员表?)

哈希集是一个

public class HashSet<T> : ICollection<T>, ISerializable, IDeserializationCallback, ISet<T>, IReadOnlyCollection<T>

我可以使用显式强制转换,但我不知道为什么不能将它用作 IReadOnlyCollection。

HashSet<DateTime> set = new HashSet<DateTime> { DateTime.Today };
ICollection<DateTime> collection = set; // OK
ISerializable serializable = set;       // OK
IDeserializationCallback deserializationCallback = set; // OK
ISet<DateTime> iSet = set;                              // OK
IReadOnlyCollection<DateTime> castReadOnlyCollection = (IReadOnlyCollection<DateTime>)set; // OK
IReadOnlyCollection<DateTime> readOnlyCollection = set; // Error

为什么我不能在没有显式转换的情况下使用它?

我正在使用 .NET 框架 4.5

【问题讨论】:

  • 显然它并不总是实现该接口stackoverflow.com/questions/11849861/…
  • 这是 .NET 4.5 中的一个糟糕问题,由添加 IReadOnlyCollection 以支持 WinRT 语言投影和 WinRT 没有等效的集合引起。它在 4.5.1 中得到修复,只需更改项目的框架目标作为解决方法。

标签: c# .net


【解决方案1】:

您使用的是 4.5,而 Hashset 直到 4.6 才实现 IReadOnlyCollection

来自 MSDN:

HashSet 从 .NET Framework 4.6 开始实现 IReadOnlyCollection 接口;在以前版本的 .NET Framework 中,HashSet 类没有实现这个接口。

https://msdn.microsoft.com/en-us/library/bb359438(v=vs.110).aspx

【讨论】:

  • 在页面顶部显示“.NET Framework 4.6 和 4.5”,所以我没想到 API 会发生变化。事实并非如此,很高兴知道。谢谢。
  • 这就是文档的世界。有些人比其他人好,但不幸的是,所有人都不可避免地会出现错误。
【解决方案2】:

这是因为在 .NET 4.5 中,HashSet&lt;T&gt; 没有实现 IReadOnlyCollection&lt;T&gt;。在 .NET 4.6 中确实如此,因此隐式转换按预期工作。

顺便说一句,您的代码中的显式转换 sn-p 编译,但它会在运行时失败。它可以编译是因为set 变量的类型是HashSet&lt;DateTime&gt;,并且由于HashSet&lt;DateTime&gt; 不是密封的,因此可能存在实现该接口的子类。

【讨论】:

  • 谢谢,我可能还有另一个奇怪的问题。项目说是 Framework 4.5,但使用 cast 的 R# 测试成功(单元测试应使用项目的目标平台)。
猜你喜欢
  • 2021-10-13
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
相关资源
最近更新 更多