属性初始化程序无法引用非静态字段

时间:2018-06-21 08:47:00

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

我认为这样的新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);

2 个答案:

答案 0 :(得分:0)

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

这里的问题是,字段初始化器是在构造函数之前设置的,不能保证设置或构造了另一个属性,或者不能保证顺序发生。

如果要在构造上分配某些东西,则需要在构造函数中完成

Fields (C# Programming Guide)

  

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

     

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

更多信息

  

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

     

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

答案 1 :(得分:0)

实际上就是这样:

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

因此,问题。