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によるコメントを参照)、これは許可されていません。可能。

呼び出されたメソッドが静的である場合(したがって、型で宣言されている場合)、静的メンバーはインスタンスメンバーの前に初期化されるため、呼び出すことができます。


現在、フィールドの初期化の順序は保証されていません。これは、コンパイラyの前に初期化することを決定する可能性があることを意味しますmB。この場合、フィールドでメソッドを呼び出して別のフィールドを初期化することが許可されている場合は、を取得しNullReferenceExceptionます。そもそもこの問題を回避し、この動作を許可しないことをお勧めします。

于 2013-01-11T16:25:53.527 に答える