...「フィールド初期化子が非静的フィールド、メソッド、またはプロパティを参照することはできません」このエラーが発生します。
エラーメッセージをより注意深くお読みください。何が間違っているかを正確に伝えています。 フィールド初期化子は、非staticメソッドを参照できません。これは、コンパイラがこのバグからあなたを守るためです。
class C
{
int foo;
int bar = GetBar();
public C(int newFoo)
{
this.foo = newFoo;
}
private int GetBar() { return this.foo + 1; }
}
「新しいC(123)」を実行します。バーは何に設定されていますか?これが法的コードであれば、124ではなく1に設定されます。なぜですか?最初のfooが0に初期化され、GetBar()が呼び出されると、コンストラクタ本体はthis.fooを123に設定します。
このバグを回避するには、フィールドの初期化子でインスタンスメソッドまたはフィールドを参照することはできません。
さて、あなたは合理的にあなたのコードで、あなたがいない使用インスタンスメソッド、あなただけ参照にそれを行うことを指摘するかもしれません。あなたは実際にはと呼ぶことはありません。これは実際には安全です。しかし、C#のルールは単純で控えめに設計されています。我々はこのケースが安全であることを証明できるにもかかわらず、我々は保守的な、シンプルなパスを取り、フィールド初期化子内のインスタンスへいかなる参照が違法であると言います。
私は静的にメソッドを変更すると、それが動作します。
正しい。その場合、このメソッドは、まだセットアップされていないインスタンス状態に依存しません。
しかし、私はしたくありません。
[OK]を選択した場合、唯一の選択肢は
フィールドイニシャライザの使用を中止することです。コンストラクタに初期化を入れます。初期化によって誤って初期化されていない状態が使用されないようにする責任があります。
私のコードをしてください示しています。 – Seva
drawFloorAround()のオブジェクトへの参照が必要です。 – phillip
@philip:いいえ、どちらも動作しません。オブジェクトが「これ」であると思われる可能性が高い場合、同じエラーが発生します。 *フィールドイニシャライザで "this"を参照することはできません。* –