4

List<T>静的フィールドと非静的フィールドを持つクラスがあります。次に、このリストを次のようなオブジェクトで初期化したいと思います。

class C
{
    private Bar bar;

    private static List<Foo> list = new List<Foo>()
    {
        new Foo(nameof(bar)),                    // OK
        new Foo(nameof(bar) + nameof(bar.Baz))   // Error CS0236
    };
}

最初のFooオブジェクトの作成は正常に機能しますが、エラーが発生します

フィールド初期化子は、非静的フィールド、メソッド、またはプロパティ C.bar を参照できません

2番目に。

静的メンバーがインスタンス データにアクセスできないことは承知しています (この質問を参照してください)。しかし、私が理解している限りでnameofは、コンパイル時に評価され、メタデータのみにアクセスし、インスタンス データにはアクセスしません。では、なぜこれが機能しないのでしょうか。回避策はありますか?

4

1 に答える 1

5

回避策は簡単です。変数名の代わりに型名を使用します。

new Foo(nameof(bar) + nameof(Bar.Baz))

その理由については、よくわかりません。おそらく、そこに変数があると、コンパイラーが変数を初期化する必要があるためです。(問題ではないことがわかりますが、おそらくコンパイラはそれほど賢くありません...)。静的型名だけが必要です。

于 2016-01-14T14:02:04.413 に答える