C# 为什么我们不能在另一个类方法之外使用类方法?

C# 为什么我们不能在另一个类方法之外使用类方法?,c#,oop,C#,Oop,这是我的问题: 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 } } 有人能解释上面的区别吗?必须在类的实例上使用类中的方法初始化(在声明的同时) 由于在初始化字段时(由于字段初始化发生在任何构造函数执

这是我的问题:

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
    }
}
有人能解释上面的区别吗?

必须在类的实例上使用类中的方法初始化(在声明的同时)

由于在初始化字段时(由于字段初始化发生在任何构造函数执行之前),不允许引用实例本身(请参见C#language reference version 4.0和中的第10.5.5.2节)

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



现在,不能保证字段初始化的顺序-这意味着编译器可能决定在
mB
之前初始化
y
。在这种情况下,如果允许对一个字段调用一个方法来初始化另一个字段,您将得到一个
NullReferenceException
。最好首先避免这个问题,不要允许这种行为。

你希望它什么时候执行?让你的问题更清楚。。看看
method1()
的签名是什么?很抱歉,有一个输入错误,我刚刚编辑了它。不是真的。字段初始值设定项不必使用常量。@在此上下文中,Eve编译时常量意味着编译器必须能够在编译时解析字段的值。@MattDavey仍然不是true。请参阅:现在使用Oded的编辑,答案是正确的。那么实例不是在构造函数之前创建的吗?原因是什么?因为我已经在类a的字段初始化时创建了对对象的引用,不是吗?