この質問は、C# でアクセスするフィールド初期化子の違法性に関するCristi Diaconescu の拡張です。this
これは C# では違法です。
class C
{
int i = 5;
double[] dd = new double[i]; //Compiler error: A field initializer cannot reference the non-static field, method, or property.
}
わかりました、なぜこれが違法であるかについての合理的な説明は、とりわけ、Eric Lippertによって与えられます:
つまり、コンストラクター本体が実行される前にレシーバーにアクセスできるということは、バグのあるプログラムを作成しやすくする、わずかな利点の機能です。そのため、C# 言語の設計者はそれを完全に無効にしました。レシーバーを使用する必要がある場合は、そのロジックをコンストラクター本体に入れます。
また、C# の仕様はかなり単純です (ある程度までは)。
インスタンス フィールドの変数初期化子は、作成中のインスタンスを参照できません。したがって、変数初期化子が simple-name を介して任意のインスタンス メンバーを参照するのはコンパイル時エラーであるため、変数初期化子で this を参照するのはコンパイル時エラーです。
だから私の質問は、「単純な名前を介して」とはどういう意味ですか?
これが合法になる代替メカニズムはありますか?仕様のほぼすべての単語が非常に特定の理由で存在することは確かですが、この特定のコードの違法性を単純な名前による参照に制限する理由は何ですか?
編集:私は自分の質問をうまく言い表していません。「単純名」の定義を求めているのではなく、その特定のシナリオに違法性を限定する理由について尋ねています。どのような方法でもインスタンス メンバーを参照することが常に違法である場合、なぜそれをそれほど狭く指定するのでしょうか? そうでない場合、どのメカニズムが合法でしょうか?