C# 无法将哈希集转换为IReadOnlyCollection

C# 无法将哈希集转换为IReadOnlyCollection,c#,.net,C#,.net,我有一个HashSet,我正试图将其转换到IReadOnlyCollection中,但我遇到了错误: 无法将类型“System.Collections.Generic.HashSet”隐式转换为“System.Collections.Generic.IReadOnlyCollection”。存在显式转换(是否缺少强制转换?) Hashset是一个 public class HashSet<T> : ICollection<T>, ISerializable, IDeser

我有一个HashSet,我正试图将其转换到IReadOnlyCollection中,但我遇到了错误:

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

Hashset是一个

public class HashSet<T> : ICollection<T>, ISerializable, IDeserializationCallback, ISet<T>, IReadOnlyCollection<T>
公共类哈希集:ICollection、ISerializable、IDeserializationCallback、ISet、IReadOnlyCollection
我可以使用显式强制转换,但我不知道为什么不能将其用作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
HashSet=newhashset{DateTime.Today};
ICollection collection=set;//好啊
ISerializable serializable=set;//好啊
IDeserializationCallback反序列化Callback=set;//好啊
ISet ISet=set;//好啊
IReadOnlyCollection castReadOnlyCollection=(IReadOnlyCollection)集;//好啊
IReadOnlyCollection readOnlyCollection=set;//错误
为什么我不能在没有显式强制转换的情况下使用它


我使用的是.NET framework 4.5,这是因为在.NET 4.5中,
HashSet
没有实现
IReadOnlyCollection
。在.NET4.6中,确实如此,因此隐式强制转换的工作方式与预期的一样


顺便说一句,代码段中的显式强制转换可以编译,但在运行时会失败。它之所以编译,是因为
set
变量的类型是
HashSet
,而且
HashSet
没有密封,所以可能存在实现接口的子类。

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

从MSDN:

HashSet从.NETFramework 4.6开始实现IReadOnlyCollection接口;在.NET Framework的早期版本中,HashSet类没有实现此接口


显然,它并不总是实现该接口。它是.NET 4.5中的一个oops,这是由于添加了IReadOnlyCollection以支持WinRT语言投影,而WinRT没有等效的集合。它在4.5.1中得到了修复,只需更改项目的框架目标作为解决方法。谢谢,我可能还有另一个奇怪的问题。Project说的是Framework 4.5,但cast的R#test成功了(单元测试应该使用项目的目标平台)。页面顶部写的是“.NET Framework 4.6和4.5”,所以我没想到API会有变化。事实并非如此,很高兴知道。谢谢。这就是文档的世界。不幸的是,有些人比其他人好,但所有人都不可避免地会有不准确之处。