这个问题已经在这里有一个答案:
- 为什么我不能访问C#protected成员除了这个样子? 7个回答
我写了下面的代码:
public class A
{
protected string Howdy = "Howdy!";
}
public class B : A
{
public void CallHowdy()
{
A a = new A();
Console.WriteLine(a.Howdy);
}
}
现在,在VS2010
它导致以下编译错误:
不能访问受保护成员“AA”经由类型“A”的限定词; 限定符的类型必须是“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
继承从数据A
在此实例。
你可以这样做
public class B : A
{
public void CallHowdy()
{
Console.WriteLine(Howdy);
}
}
在你的代码,你想从访问你好一个A外,没有从B.中在这里,你是一个B的内部,因此能够访问受保护的成员A.
基类的被保护的成员是仅当访问通过派生类类型发生派生类访问。
你得到错误,因为,因为A不是从衍生B.
http://msdn.microsoft.com/en-us/library/bcd5672a(v=vs.90).aspx
被保护成员不仅对本身及衍生会员可见。 在你的情况下,A的声明意味着只有公共成员都可以访问,就好像你从其它类实例化的一个。 你可以,但是,简单的写this.Howdy,因为,由于派生链,你好可从B类的内部