我写了以下代码:
public class A
{
protected string Howdy = "Howdy!";
}
public class B : A
{
public void CallHowdy()
{
A a = new A();
Console.WriteLine(a.Howdy);
}
}
现在,在VS2010
中会导致以下编译错误:
无法通过类型为“A”的限定符访问受保护的成员“A.a”;限定符必须是'B'类型(或从中派生出来)。
这对我来说似乎很不合逻辑 - 为什么我不能从类的方法中访问类实例的protected
字段,该方法是从它派生的?
那么,为什么会发生这种情况?
找到了严格的答案 - http://blogs.msdn.com/b/ericlippert/archive/2005/11/09/491031.aspx
答案 0 :(得分: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);
}
}
因为B
在此实例中继承了A
的数据。
答案 1 :(得分:3)
你可以做到
public class B : A
{
public void CallHowdy()
{
Console.WriteLine(Howdy);
}
}
在你的代码中,你试图从A外部访问Howdy,而不是从B中访问。这里,你在B中,因此可以访问A中的受保护成员。
答案 2 :(得分:0)
只有通过派生类类型进行访问时,才能在派生类中访问基类的受保护成员。
您收到错误,因为A不是从B派生的。
http://msdn.microsoft.com/en-us/library/bcd5672a(v=vs.90).aspx
答案 3 :(得分:0)
受保护的成员仅对其自身和派生成员可见。在您的情况下,A的声明意味着只有公共成员可以访问,就像您从任何其他类实例化A一样。但是,你可以简单地写一下。因为,由于派生链,你可以从B级内部获得。