在静态字段初始值设定项中使用非静态字段的名称
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))
至于为什么,我不是很清楚。也许是因为在那里有变量需要编译器初始化它。 (我们可以看到这无关紧要,但也许编译器并不那么聪明......)。它只需要静态类型名称。
我有一个带有静态 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))
至于为什么,我不是很清楚。也许是因为在那里有变量需要编译器初始化它。 (我们可以看到这无关紧要,但也许编译器并不那么聪明......)。它只需要静态类型名称。