2010-11-15 38 views
0

请给我解释一下这段代码是如何工作的,以及为什么它会海槽B类为什么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

它说你必须通过B的实例访问,所以不能通过公共类B中的ax = 1:A – Younes 2010-11-15 10:04:15

+0

但是为什么当B从类A继承 – NoviceToDotNet 2010-11-15 10:06:29

+0

我对整个代码感到困惑,静态方法的参考变量传递,以及非静态如何与静态沟通... – NoviceToDotNet 2010-11-15 10:07:36

回答

2

代码中的错误在B只能通过具有编译表达式访问受保护的变量时间类型为B或某种类型来自B。这基本上是受保护访问的工作原理。

从C#4语言规范的3.5.3节:

当受保护的实例成员,其中它被声明的类的程序文本之外访问,并且当受保护的内部实例构件是在声明它的程序的程序文本之外访问,访问必须在来自声明类的声明中进行。此外,访问需要发生该派生类类型的实例或从其构造的类类型。此限制可防止一个派生类访问其他派生类的受保护成员,即使这些成员是从相同的基类继承的。

+0

先生,我正在阅读的东西,但我只是没有得到它,请详细说明这一点..一个很大的困惑与我是多么非静态与静态通信...当我访问静态上下文中的任何非静态时,它会抛出一个错误,那么为什么不在这里 – NoviceToDotNet 2010-11-15 10:13:29

+0

我应该把它看作是一个规则,或者有一些逻辑背后,我试图探索 – NoviceToDotNet 2010-11-15 10:14:03

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 

见我们得到的xB功能的访问,但它的实例已经没有x访问。

+0

我想知道为什么B的实例无法访问x,而由于继承而在B中可用,请让elabor吃了这个关键词就可以了,怎么可能 – NoviceToDotNet 2010-11-15 10:43:50

+0

@NoviceToDotNet在技术上,x的上下文被限制在B({....})块中。它只能访问这些块。 – 2010-11-15 10:49:09

+0

没有得到你的上面的评论请解释我的先生这是什么让我困惑的了解整个coed – NoviceToDotNet 2010-11-15 10:59:08

相关问题