Почему HashSet <T>.IsReadOnly явный? - PullRequest
12 голосов
/ 13 апреля 2009

Это

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

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

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

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

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

Ответы [ 2 ]

17 голосов
/ 13 апреля 2009

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

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

5 голосов
/ 13 апреля 2009

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

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

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

...