不能将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
你正在使用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>
不是密封的,因此可能存在实现该接口的子类。