【问题标题】:Property Initializer cannot reference non-static field属性初始化器不能引用非静态字段
【发布时间】:2018-11-30 12:44:39
【问题描述】:

我认为新的 C# 6.0 属性初始化器是这样的。

public MyType MyProperty { get; } = new MyType(OtherProperty);

相当于这个

private MyType _myVariable;
public MyType MyProperty { get { return _myVariable ?? _myVariable = new MyType(OtherProperty); } }

(OtherProperty 作为实例的一部分可用,不限于静态)

但在上面首先我得到“字段初始值设定项不能引用非静态字段”。我做错了吗,还是属性初始化器和

一样受限
public readonly MyType MyVariable = new MyType(NeedsStaticReference);

【问题讨论】:

  • @PhilMasterG 不是,我问的是 C# 6.0 中新增的属性初始化器
  • 虽然它们看起来相同,但它们并不相同
  • 其实相当于初始化一个私有字段,所以必须使用非静态初始化器。

标签: c# properties c#-6.0 initializer property-initializer


【解决方案1】:

在您的第二个示例中,该字段是在首次使用时设置的。

这里的问题是,字段初始化器是在构造函数之前设置的,并且不能保证设置或构造其他属性或发生这种情况的顺序。

如果你想在构造函数中赋值,你需要在构造函数中完成

Fields (C# Programming Guide)

字段在构造函数之前立即初始化 对象实例被调用。如果构造函数分配了 a 的值 字段,它将覆盖字段声明期间给出的任何值。

字段初始化器不能引用其他实例字段

还有更多信息

可以选择将字段声明为静态的。这使得场 随时可供调用者使用,即使没有该类的实例 存在。有关详细信息,请参阅静态类和静态类 成员。

可以将字段声明为只读。只读字段只能是 在初始化期间或在构造函数中赋值。一种 static``readonly 字段与常量非常相似,除了 C# 编译器无权访问静态只读的值 编译时的字段,仅在运行时

【讨论】:

    【解决方案2】:

    其实是这样的:

    private readonly MyType _myVariable = new MyType(OtherProperty);
    public MyType MyProperty { get { return _myVariable; } }
    

    因此,问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-16
      • 2013-01-04
      • 2022-01-23
      相关资源
      最近更新 更多