无法将HashSet转换为IReadOnlyCollection

时间:2015-09-24 13:27:42

标签: c# .net

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

  

无法将类型'System.Collections.Generic.HashSet'隐式转换为'System.Collections.Generic.IReadOnlyCollection'。存在显式转换(您是否错过了演员?)

Hashset是

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

2 个答案:

答案 0 :(得分:27)

您使用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

答案 1 :(得分:12)

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

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