为什么HashSet <T>不实现IReadOnlyCollection <T>?

Jul*_*ain 10 collections base-class-library .net-4.5

新的只读接口在.NET 4.5,如IReadOnlyCollection<T>IReadOnlyDictionary<TKey,TValue>是非常有用的,特别是因为他们已经在通用的BCL实现,例如Collection<T>,List<T>Dictionary<TKey,TValue>.

但是,HashSet<T>SortedSet<T>没有升级到实现IReadOnlyCollection<T>,我看不到这个决定背后的逻辑,因为这些类匹配接口而没有任何修改或改变.是不是被BCL团队忽视了,还是我在这里缺少什么?

(这尤其令人讨厌,因为没有内置的方法将一个集合包装在一个内部IReadOnlyCollection<T>.确实,ReadOnlyCollection<T>包装IList<T>而不是ICollection<T>.我知道编写自己的包装器是微不足道的.)

Col*_*nic 13

2015年更新:在.NET 4.6中修复

只读接口在集合类型HashSet,LinkedList,Queue,SortedDictionary,SortedList,SortedSet和Stack上实现.[944715]

https://dotnet2015.blob.core.windows.net/changes/dotnet46-changes.txt


Han*_*ant 5

在4.5中添加IReadOnlyXxx接口的最可能的原因是,它们需要使.NET集合在WinRT项目(商店和电话应用程序)中可用。必须将集合正确映射到WinRT的IVectorView <>和IMapView <>接口。这是通过CLR中内置的语言投影自动完成的。关键在于WinRT没有等效的ISet <>接口,因此不需要更改HashSet <>。


更新:.NET 4.5.1中解决了不对称问题,毫无疑问,这要归功于大量的客户反馈:),HashSet <>现在也实现了IReadOnlyCollection <>

  • 我完全了解使用`IReadOnlyCollection`与使用不可变集合的含义(确实是个好时机,昨天我对它们做了一些测试!)。我不是将它们用作对不变性的保证,而是将其用作“有计数的保证的非惰性`IEnumerable &lt;T&gt;`”。如果调用者将它们强制转换回实现的类型,那么我认为这与使用反射修改私有成员一样安全。感谢您提到WinRT类型,这似乎是添加这些接口的主要原因。 (6认同)