C#受保护的成员通过基类变量访问

Rom*_*man 11 c# inheritance protected base-class

这可能看起来相当新手问题,但你能解释为什么方法Der.B()无法通过Base类变量访问受保护的Foo吗?这对我来说很奇怪:

public class Base
{
    protected int Foo;
}

public class Der : Base
{
    private void B(Base b) { Foo = b.Foo; } // Error: Cannot access protected member

    private void D(Der d) { Foo = d.Foo; } // OK
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Eri*_*ert 22

这是一个经常被问到的问题.要弄清楚为什么这是非法的,请考虑可能出现的问题.

假设您有另一个派生类Frob派生自Base.现在你将Frob的一个实例传递给Der.B. 你能从Der.B访问Frob.Foo吗?不,绝对不是.Frob.Foo受到保护; 它只能从Frob和Frob的子类访问.Der不是Frob,也不是Frob的子类,因此它无法访问Frob的受保护成员.

如果不清楚,请参阅我关于此主题的文章:

http://blogs.msdn.com/ericlippert/archive/2005/11/09/491031.aspx