在静态字段初始化器中使用非静态字段的名称

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

我知道静态成员不能访问实例数据(请参阅此问题)。但据我所知,nameof 在编译时计算并仅访问元数据而不是实例数据。那么为什么这样做不起作用,有没有解决方法?

1个回答

6
解决方法很简单,使用类型名称而不是变量名称:
new Foo(nameof(bar) + nameof(Bar.Baz))

关于原因,我不是很确定。可能是因为在那里放置变量需要编译器初始化它(我们可以看到这并不重要,但也许编译器不够聪明...)。它只需要静态类型名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接