これは私の質問です:
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#言語リファレンスバージョン4.0のセクション10.5.5.2およびEric Lippertによるコメントを参照)、これは許可されていません。可能。
呼び出されたメソッドが静的である場合(したがって、型で宣言されている場合)、静的メンバーはインスタンスメンバーの前に初期化されるため、呼び出すことができます。
現在、フィールドの初期化の順序は保証されていません。これは、コンパイラがy
の前に初期化することを決定する可能性があることを意味しますmB
。この場合、フィールドでメソッドを呼び出して別のフィールドを初期化することが許可されている場合は、を取得しNullReferenceException
ます。そもそもこの問題を回避し、この動作を許可しないことをお勧めします。