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

Почему HashSet <T>.IsReadOnly явно?

Это

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

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

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

Почему ISReadOnly не выполнялся нормально?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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