Вопрос

Этот

var h = new HashSet<int>();
var r = h.IsReadOnly;

не компилируется.я должен сделать

var r = ((ICollection<int>)h).IsReadOnly;

почему IsReadOnly не был реализован нормально?

(я не спрашиваю как, но почему)

Это было полезно?

Решение

Я предполагаю, что это потому, что, хотя HashSet реализует ICollection, IsReadOnly не имеет значения для HashSet.Фактически, если вы это отразите, свойство всегда возвращает false.Явная реализация скрывает этот метод от общедоступного интерфейса.

Другая причина заключается в том, что интерфейс ICollection может быть реализован по случайным причинам (например, для поддержки сериализации xaml), а не потому, что он необходим для основного использования класса.Таким образом, его явная реализация может избавить интерфейс класса от беспорядка.

Другие советы

Есть две основные причины, по которым вам следует прибегнуть к явной реализации интерфейса (источник: MSDN):

  1. Вы реализуете несколько интерфейсов с элементами, содержащими одинаковые подписи, и хотите, чтобы эти члены вели себя по-разному.
  2. Член интерфейса не представляет особого интереса для класса, но необходим для ссылки на объекты через интерфейс.

Для HashSet<T>, применяется последний случай, поскольку хеш-набор никогда не доступен только для чтения и IsReadOnly таким образом, всегда будет возвращаться false.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top