Проверьте этот пример из MSDN:
class A
{
protected int x = 123;
}
class B : A
{
void F()
{
A a = new A();
B b = new B();
a.x = 10; // Error
b.x = 10; // OK
}
}
См., Что a.x выдает ошибку, потому что вы пытаетесь получить доступ к свойству извне класса (вызывая опору внутри A изнутри класса B). Но с b.x все в порядке, потому что вы звоните изнутри B. Имеет смысл?