C# List<T> скрывает свойства?

Возможный дубликат:
Как List делает IsReadOnly закрытым, когда IsReadOnly является членом интерфейса?

Хорошо, это сводит меня с ума. List<T> инвентарь IList<T>, Тем не мение,

IList<int> list = new List<int>();
bool b = list.IsReadOnly;
bool c = ((List<int>)list).IsReadOnly;    // Error

Ошибка:

System.Collections.Generic.List не содержит определения для IsReadOnly, и метод расширения IsReadOnly, принимающий первый аргумент типа System.Collections.Generic.List, не найден (если вы пропустили директиву using или ссылка на сборку?)

Как это может быть? Разве это не нарушает того самого правила, которое мы всем говорим о том, чтобы не скрывать участников? Какая деталь реализации здесь?

4 ответа

Решение

Потому что реализация осуществляется через явную реализацию интерфейса.

Это означает, что это определяется как

bool IList<T>.IsReadOnly { get; set; //etc }

http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx

И именно поэтому это не из Списка.

List<T> инвентарь IList<T> явно, поэтому вы должны привести объект к интерфейсу, прежде чем иметь возможность получить доступ IsReadOnly, Из MSDN:

Класс, который реализует интерфейс, может явно реализовать член этого интерфейса. Когда член явно реализован, к нему нельзя получить доступ через экземпляр класса, но только через экземпляр интерфейса

Если вы посмотрите на класс List, вы увидите это:

 bool IList.IsReadOnly { [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
        get; }

Все, что действительно важно, - это то, что IsReadOnly объявлен с использованием явной реализации, что означает, что свойство можно увидеть, только если объект объявлен как объект IList.

Явная реализация интерфейса, что-то вроде:

bool IList<T>.IsReadOnly { get; }
Другие вопросы по тегам