请解释我这段代码是如何工作的,以及为什么它会在B类中出现错误
public class A
{
protected int x;
static void F(A a, B b) {
a.x = 1; // Ok
b.x = 1; // Ok
}
}
public class B: A
{
static void F(A a, B b) {
a.x = 1; // Error, must access through instance of B
b.x = 1; // Ok
}
}
答案 0 :(得分:2)
B
中的代码只能通过编译时类型为B
的表达式或从B
派生的某种类型来访问受保护的变量。这基本上是受保护的访问如何运作。
来自C#4语言规范的第3.5.3节:
当在声明它的类的程序文本之外访问受保护的实例成员时,并且当在声明它的程序的程序文本之外访问受保护的内部实例成员时,必须进行访问在一个类声明中,该声明派生自声明它的类。此外,需要访问通过该派生类类型的实例或从其构造的类类型。此限制可防止一个派生类访问其他派生类的受保护成员,即使成员是从同一基类继承的。
答案 1 :(得分:1)
protected
关键字是会员 访问修饰符。一个protected
成员 可以在课堂上访问 宣告它,从内部宣布 来自class
的任何class
宣布这个成员。
public class A
{
public int x;
public static void F(A a, B b)
{
a.x = 1;
b.x = 1;
}
}
public class B : A
{
public static void F(A a, B b)
{
a.x = 1;
b.x = 1;
}
}
为什么我使用public
访问修饰符重新定义它。 protected
修饰符限制了对继承class
块的访问权限。
Class A {
protected int x = 0;
}
Class B : A {
private void SomeFunc() {
Console.WriteLine(this.x.ToString()); // This will work!
}
}
但是,如果您尝试访问x
,B
将无法获得任何内容。
B b = new B();
b.x; // Got nothing in IntelliSense
我们在x
的函数中看到了B
的访问权限,但它的实例无法访问x
。