【问题标题】:Using nameof of non-static field in static field initializer在静态字段初始化器中使用非静态字段的名称
【发布时间】:2016-01-14 13:59:22
【问题描述】:

我有一个带有静态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

在第二个。

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

【问题讨论】:

    标签: c# nameof


    【解决方案1】:

    解决方法很简单,使用类型名而不是变量名:

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

    原因,我不太确定。也许是因为那里有变量需要编译器对其进行初始化。 (我们可以看到没关系,但也许编译器没有那么聪明......)。它只需要静态类型名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 2014-02-26
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      相关资源
      最近更新 更多