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