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

Как List <T> делает IsReadOnly приватным, когда IsReadOnly является членом интерфейса?

Я создаю специализированный прокси-класс, который реализует IList<T> и обертывает внутренний экземпляр List<T>.

List<T> сам реализует IList<T>, который объявляет член bool IsReadOnly, но когда я пытаюсь получить доступ к этому члену из своего собственного класса, я не могу, потому что в List<T> IsReadOnly является частной.

Итак, мой вопрос; если для реализации интерфейса требуется, чтобы все реализованные члены были общедоступными, почему List<T> может реализовать IsReadOnly как закрытый и, таким образом, лишить меня доступа к нему?

4b9b3361

Ответ 1

Он явно реализует элемент интерфейса.

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

Обратите внимание, что это не делает член интерфейса private. Он по-прежнему доступен публично, но только если вы посмотрите на объект через интерфейс (с кастингом).

Ответ 2

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

bool IList<T>.IsReadOnly { get { ... } }

Этот элемент по-прежнему доступен, но к нему можно получить доступ только с помощью типа IList<T>.

List<T> list = ...;
bool isReadOnly = ((IList<T>)list).IsReadOnly;

При реализации IList<T> тип не обещал предоставить значение IsReadOnly. Вместо этого он обещал предоставить свойство IsReadOnly, если он рассматривается как IList<T>. Независимо от того, предоставляет ли он его на фактическом классе, более чистый выбор автора типа.

Ответ 3

В случае, если List<T>, IsReadOnly не имеет смысла: он всегда false. List поэтому реализует интерфейс ICollection<T>IList) явно, тем самым делая интерфейс "private" для нормального использования. Если вам все равно нужно получить к нему доступ, вы можете через явное приведение к интерфейсу:

bool result = ((ICollection<string>)yourStringList).IsReadOnly;
// Or equivalently using `IList`.