C#访问派生类中的受保护成员

我写了以下代码:

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

你没有从类中访问它,你试图访问变量,就好像它是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); } } 

因为B在这个实例中inheritance了A中的数据。

你可以做到

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

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

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

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

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

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