首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将HashSet转换为IReadOnlyCollection

无法将HashSet转换为IReadOnlyCollection
EN

Stack Overflow用户
提问于 2015-09-24 13:27:42
回答 2查看 4K关注 0票数 17

我有一个HashSet,我试图将它转换到IReadOnlyCollection中,但是我得到了错误:

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

Hashset是一个

代码语言:javascript
复制
public class HashSet<T> : ICollection<T>, ISerializable, IDeserializationCallback, ISet<T>, IReadOnlyCollection<T>

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

代码语言:javascript
复制
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框架4.5

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-24 13:33:04

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

来自MSDN:

HashSet实现IReadOnlyCollection接口,从.NET Framework4.6开始;在.NET框架的早期版本中,HashSet类没有实现这个接口。

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

票数 27
EN

Stack Overflow用户

发布于 2015-09-24 13:32:58

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

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

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32762631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档