这个问题已经有一个答案在这里:

它可能似乎相当新手的问题,但是你可以解释为什么方法Der。B()不能接受保护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
}

谢谢!

有帮助吗?

解决方案

这是一个常问问题。找出为什么这是非法的,认为有关什么可以去错误的。

假设你已经另一个源类Frob来自基地。现在你通过一个实例Frob到Der。B.你应该能够访问Frob.Foo从Der。B?不,绝对不是。Frob.Foo得到保护;它应该只可从Frob和亚类的Frob.德是不Frob并不是一个子类的Frob,所以它没有获得Frob的保护成员。

如果这还不清楚,看看我的文章的主题:

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

其他提示

B你想要访问一个受保护的成员的另一类。事实上你是继承这类是无关紧要的。在D访问了受保护的成员的基本类中的当前类。在这方面,你可以访问东西从德和受保护的成员的类型,这是继承。

你可以绕过这种限制由宣布一个静态的方法的基类:

public class Base
{
    protected int Foo;

    protected static int GetFoo(Base b)
    {
        return b.Foo;
    }
}

public class Der : Base
{
    private void B(Base b) { Foo = GetFoo(b); } // OK
}

简单地说,保护的允许访问的子类。

在:

private void B(Base b) { Foo = b.Foo; }

你正在尝试接受保护的成员的实例Der没有访问。这只会对它的访问,如果这是基本类中的当前实例的Der(此)。

private void D(Der d) { Foo = d.Foo; } // OK

工作正常,因为你会通过Der访问它的基类保护的方法。

在这种情况下,你们想你会希望使用"内部"int Foo。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top