无法将HashSet转换为IReadOnlyCollection

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

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

哈希特是一个

public class HashSet : ICollection, ISerializable, IDeserializationCallback, ISet, IReadOnlyCollection 

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

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

如果没有明确的演员,我为什么不能使用它呢?

我正在使用.NET framework 4.5

你使用的是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 4.5中, HashSet不实现IReadOnlyCollection 。 在.NET 4.6中,它确实如此,因此隐式转换按预期工作。

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