Ключевое слово «protected» означает, что только тип и типы, производные от этого типа, могут получить доступ к члену. D не имеет отношения к C, поэтому не может получить доступ к члену.
У вас есть несколько вариантов, если вы хотите иметь доступ к этому члену
- Сделать общедоступным
- Сделай это внутренним. Это позволит любым типам получать доступ к элементу в той же сборке (или другим сборкам, если вы добавите друзей)
- Вывод D из C
EDIT
Этот сценарий вызывается в разделе 3.5.3 спецификации C #.
Причина, по которой это недопустимо, заключается в том, что она допускает вызовы между иерархиями. Представьте себе, что в дополнение к D был еще один базовый класс C, называемый E. Если ваш код мог компилироваться, он позволил бы D получить доступ к члену EF. Этот тип сценария недопустим в C # (и я считаю CLR, но я не знаю на 100%).
РЕДАКТИРОВАТЬ2 Почему это плохо
Предостережение, это мое мнение
Причина, по которой это теперь разрешено, заключается в том, что очень трудно рассуждать о поведении класса. Цель модификаторов доступа - дать разработчику контроль над тем, кто может получить доступ к определенным методам. Представьте себе следующий класс
sealed class MyClass : C {
override F(D d) { ... }
}
Подумайте, что произойдет, если функция F несколько критична по времени С нынешним поведением я могу рассуждать о правильности моего класса. Ведь есть только два случая, когда MyClass.F будет вызван.
- Где он вызывается в C
- Где я явно вызываю его в MyClass
Я могу проверить эти вызовы и прийти к разумному выводу о том, как функционирует MyClass.
Теперь, если C # разрешает межуровневый защищенный доступ, я не могу дать такой гарантии. Любой, кто находится в совершенно другой сборке, может прийти и извлечь из C. Затем он может вызвать MyClass.F по своему желанию. Это делает совершенно невозможным рассуждать о правильности моего класса.