Подтвердить что ты не робот

Почему 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> wraps IList<T>, а не ICollection<T>. Я знаю, что писать свою собственную оболочку тривиально. )

4b9b3361

Ответ 1

Наиболее похожая причина, по которой интерфейсы IReadOnlyXxx, добавленные в 4.5, были связаны с тем, что они требовали, чтобы коллекции .NET использовались в проектах WinRT (приложения Store и Phone). Необходимо правильно сопоставить коллекцию с интерфейсами WinRT IVectorView < > и IMapView < > . Это делается автоматически с помощью языковой проекции, встроенной в CLR. С clincher, что WinRT не имеет эквивалента интерфейса ISet < > , поэтому просто не нужно было изменять HashSet < > .


Обновление: асимметрия была решена в .NET 4.5.1, без сомнения, благодаря большому количеству отзывов клиентов:), HashSet < > теперь также реализует IReadOnlyCollection < >