Почему HashSet<T> не реализует IReadOnlyCollection<T>?
Новые интерфейсы только для чтения в.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>
, Я знаю, что написание моей собственной обертки тривиально.)
2 ответа
Наиболее вероятная причина, по которой интерфейсы IReadOnlyXxx были добавлены в версии 4.5, заключалась в том, что они были необходимы для обеспечения возможности использования коллекций.NET в проектах WinRT (приложения Store и Phone). Необходимо правильно сопоставить коллекцию с интерфейсами WinRT IVectorView<> и IMapView<>. Это делается автоматически с помощью языковой проекции, встроенной в CLR. С той решимостью, что WinRT не имеет эквивалента интерфейса ISet<>, так что просто не нужно было менять HashSet<>.
Обновление: асимметрия была устранена в.NET 4.5.1, без сомнения, благодаря большому количеству отзывов клиентов:), HashSet<> теперь также реализует IReadOnlyCollection<>
Обновление 2015: исправлено в.NET 4.6
Интерфейсы только для чтения реализованы для типов коллекций HashSet, LinkedList, Queue, SortedDictionary, SortedList, SortedSet и Stack. [944715]
https://dotnet2015.blob.core.windows.net/changes/dotnet46-changes.txt