为什么B级会抛出错误

时间:2010-11-15 10:03:35

标签: c#-3.0

请解释我这段代码是如何工作的,以及为什么它会在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
        }
    }

2 个答案:

答案 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!
 }
}

但是,如果您尝试访问xB将无法获得任何内容。

B b = new B();
b.x; // Got nothing in IntelliSense

我们在x的函数中看到了B的访问权限,但它的实例无法访问x