11

我写了以下代码:

public class A                             
{
    protected string Howdy = "Howdy!";     
}

public class B : A                           
{
    public void CallHowdy()
    {
        A a = new A();
        Console.WriteLine(a.Howdy);
    }
}

现在,VS2010它会导致以下编译错误:

无法通过“A”类型的限定符访问受保护的成员“Aa”;限定符必须是“B”类型(或派生自它)。

这对我来说似乎很不合逻辑 - 为什么我不能protected从派生自类的方法访问类实例的字段?

那么,为什么会发生这种情况


找到了一个严格的答案- http://blogs.msdn.com/b/ericlippert/archive/2005/11/09/491031.aspx

4

4 回答 4

7

您不是从类内部访问它,而是尝试访问该变量,就好像它是public. 你不会期望它编译,这几乎就是你想要做的:

public class SomethingElse
{
    public void CallHowdy()
    {
        A a = new A();
        Console.WriteLine(a.Howdy);
    }
}

没有关系,听起来您很困惑为什么该字段不公开。

现在,如果您愿意,您可以这样做:

public class B : A
{
    public void CallHowdy()
    {
        Console.Writeline(Howdy);
    }
}

因为BA这个实例中继承了数据。

于 2012-05-18T18:02:43.037 回答
3

你可以做

public class B : A                           
{
    public void CallHowdy()
    {
        Console.WriteLine(Howdy);
    }
}

在您的代码中,您尝试从 A 外部而不是 B 内部访问 Howdy。在这里,您在 B 内部,因此可以访问 A 中的受保护成员。

于 2012-05-18T18:02:26.877 回答
1

仅当通过派生类类型进行访问时,才能在派生类中访问基类的受保护成员。

您收到错误是因为 A 不是从 B 派生的。

http://msdn.microsoft.com/en-us/library/bcd5672a(v=vs.90).aspx

于 2012-05-18T18:03:58.890 回答
0

受保护的成员仅对其自身和派生成员可见。在您的情况下, A 的声明意味着只有公共成员是可访问的,就像您从任何其他类实例化 A 一样。但是,您可以简单地写 this.Howdy,因为由于派生链,Howdy 可以从 B 类内部获得。

于 2012-05-18T18:03:59.337 回答