Почему 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

Другие вопросы по тегам