2009-04-13 9 views
12

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

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

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

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

Почему не был установлен IsReadOnly нормально?

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

ответ

16

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

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

+0

Ах, да, это имеет смысл. HashSet также скрывает IsReadOnly по той же причине, которую я предполагаю, поэтому ошибка компиляции, если вы пытаетесь ее использовать. –

+0

BTW, вам не нужно реализовывать ICollection для сериализации xaml; коллекции должны реализовывать IDictionary или IList. Это был пример случаев, когда вам, возможно, понадобится интерфейс для случайных причин. – Will

5

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

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

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