Я думаю конкретно об универсальном классе HashSet<T>
. Это реализует несколько интерфейсов, но ни один не выставляет корректную семантику набора. А именно, ни один не поддерживает Add
возврат метода bool
. (ICollection<T>
поддержки void Add
, который может использоваться в повышении.) Также неподдерживаемый этими интерфейсами операции единого набора как объединения и пересечения. (Хотя нужно сказать, что некоторые из этих операций доступны через расширения IEnumerable<T>
.)
Это означает, что класс может только использоваться как набор с его прямой реализацией. Т.е. Вы не можете сделать чего-то вроде этого:
ISet<int> = new HashSet<int>;
Не насколько я знаю, так или иначе. Таким образом, что мотивировало выбор пропустить это?
Возможно, самая важная вещь - это: даже если можно бросить HashSet<T>
кому: ICollection<T>
и др. Вы теряете семантическое значение в API, который Вы выставляете. Таким образом, у потребителей Вашего API нет признака, они работают с набором. Таким образом, в то время как Вы могли звонить ICollection<T>.Add
и продвиньтесь, люди будут смущены, если они попытаются добавить объект дважды, и он не работает. Интерфейс набора дал бы людям правильные ожидания.
Хотя я не уверен, почему он не вошел в библиотеку базовых классов ранее, ISet
доступен в .NET 4.0, который находится всего в нескольких неделях от поставки. Интерфейс имеет большинство методов, которые вы ожидаете от набора. Вот некоторые из поддерживаемых методов:
Коллекции HashSet
и SortedSet
реализуют этот новый интерфейс.
Ознакомьтесь с Iesi.Collections.ISet , в котором добавлены функции, отсутствующие в стандартной библиотеке.