4

这是我的问题:

class A
{
    B mB = new B();  //this is fine
    int y = mB.method1(); //this is error;

    public void method2()
    {
        int x = mB.method1(); //this is fine
    }
}

有人可以解释上述差异吗?

4

1 回答 1

7

使用类中的方法初始化字段(与声明同时)必须在类的实例上完成。

由于在初始化字段时不允许引用实例本身(参见 C# 语言参考版本 4.0 中的第 10.5.5.2 节和Eric Lippert 的评论)(因为字段初始化发生在任何构造函数执行之前),所以这不是可能的。

如果调用的方法是静态的(因此在类型上声明),那么您可以调用它,因为静态成员在实例成员之前被初始化。


现在,字段初始化的顺序不能保证——这意味着编译器可能决定ymB. 在这种情况下,如果允许在一个字段上调用一个方法来初始化另一个字段,您会得到一个NullReferenceException. 最好首先避免该问题,并且不允许这种行为。

于 2013-01-11T16:25:53.527 回答