我有一个HashSet,我试图将其转换为IReadOnlyCollection,但我收到错误:
无法将类型'System.Collections.Generic.HashSet'隐式转换为'System.Collections.Generic.IReadOnlyCollection'.存在显式转换(您是否错过了演员?)
Hashset是一个
public class HashSet<T> : ICollection<T>, ISerializable, IDeserializationCallback, ISet<T>, IReadOnlyCollection<T>
Run Code Online (Sandbox Code Playgroud)
我可以使用显式转换,但我不知道为什么我不能将它用作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
Run Code Online (Sandbox Code Playgroud)
如果没有明确的演员,我为什么不能使用它呢?
我正在使用.NET framework 4.5
rmn*_*n36 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
Tho*_*que 12
这是因为在.NET 4.5中,HashSet<T>没有实现IReadOnlyCollection<T>.在.NET 4.6中,它确实如此,因此隐式转换按预期工作.
顺便说一下,你的代码片段中的显式强制转换编译,但它会在运行时失败.它编译是因为set变量是类型的HashSet<DateTime>,并且由于HashSet<DateTime>没有密封,因此可能存在实现接口的子类.
| 归档时间: |
|
| 查看次数: |
2717 次 |
| 最近记录: |