在静态字段初始值设定项中使用非静态字段的名称

Using nameof of non-static field in static field initializer

我有一个带有静态 List<T> 和一些非静态字段的 class。现在我想用像这样的一些对象来初始化这个列表:

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 对象工作正常,但出现错误

A field initializer cannot reference the non-static field, method, or property C.bar

第二个。

我知道静态成员无法访问实例数据(请参阅 this question)。但据我了解, nameof 在编译时进行评估,并且仅访问元数据而不是实例数据。那么,为什么这行不通,有解决办法吗?

解决方法很简单,使用类型名代替变量名:

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

至于为什么,我不是很清楚。也许是因为在那里有变量需要编译器初始化它。 (我们可以看到这无关紧要,但也许编译器并不那么聪明......)。它只需要静态类型名称。