不能将HashSet转换为IReadOnlyCollection

本文关键字:IReadOnlyCollection 转换 HashSet 不能 | 更新日期: 2023-09-27 18:14:18

我有一个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 framework 4.5

不能将HashSet转换为IReadOnlyCollection

你正在使用4.5和Hashset不实现IReadOnlyCollection直到4.6

来自MSDN:

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

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

这是因为在。net 4.5中,HashSet<T>没有实现IReadOnlyCollection<T>。在。net 4.6中,它是这样做的,因此隐式强制转换按预期工作。

顺便说一句,代码片段中的显式强制转换可以编译,但在运行时将失败。它编译是因为set变量是HashSet<DateTime>类型,并且由于HashSet<DateTime>不是密封的,因此可能存在实现该接口的子类。

相关文章:
  • 没有找到相关文章