这是来自MSDN的一个示例,它来自解释受保护的成员访问修饰符的部分。我的问题是,为什么我收到编译错误,如果我修改这个程序,如例II,
示例I
class A
{
protected int x = 123;
}
class B : A
{
static void Main()
{
A a = new A();
B b = new B();
b.x = 10;
}
}
示例II
class A
{
protected int x = 123;
}
//MODIFICATION IN BELOW 2 LINES
class B : A{}
class program
{
static void Main()
{
A a = new A();
B b = new B();
b.x = 10;
}
}
示例II的编译器错误:
d:\MyProgs>csc _13protected.cs
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
Copyright (C) Microsoft Corporation. All rights reserved.
_13protected.cs(14,15): error CS0122: 'A.x' is inaccessible due to its
protection level
_13protected.cs(3,23): (Location of symbol related to previous error)
d:\MyProgs>
答案 0 :(得分:4)
protected
表示它在类本身之外不可见,仅在类本身或派生类中可见。
在您的第一个示例中,它起作用,因为您的main
方法是派生类的一部分。
在您的第二个示例中,您正在尝试访问其类 的受保护成员,这是不可能的。如果您希望实现此目标,则应x
声明public
。
有关protected
的含义的详细信息,请参阅http://msdn.microsoft.com/en-us/library/bcd5672a.aspx。
答案 1 :(得分:3)
阅读access modifiers的定义,您将得到答案。
public:类型或成员可以被同一程序集中的任何其他代码或引用它的另一个程序集访问。
private:只能通过同一个类或结构中的代码访问类型或成员。
protected:只能通过同一个类或结构中的代码或从该类派生的类中访问类型或成员。
internal:类型或成员可以由同一程序集中的任何代码访问,但不能从其他程序集访问。
答案 2 :(得分:0)
您需要注意访问受保护字段的实际类。
在第二个示例中,您尝试从程序类访问b.X,而#34; protected"修饰符,因为程序类不会从A继承。
另一方面,在第一个例子中,对B.X的实际访问发生在B类中,它继承自A,因此允许访问" protected"改性剂。