结构构造函数:“控制返回给调用者之前,必须完全分配字段”。

这里是我想写的一个结构:

public struct AttackTraits { public AttackTraits(double probability, int damage, float distance) { Probability = probability; Distance = distance; Damage = damage; } private double probability; public double Probability { get { return probability; } set { if (value > 1 || value < 0) { throw new ArgumentOutOfRangeException("Probability values must be in the range [0, 1]"); } probability = value; } } public int Damage { get; set; } public float Distance { get; set; } } 

这会导致以下编译错误:

“this”对象在其所有字段分配之前无法使用

在控制返回给调用者之前,必须完全分配字段“AttackTraits.probability”

自动实现属性“AttackTraits.Damage”的后台字段必须在控制返回给调用者之前完全分配。 考虑从构造函数初始值设定项中调用默认构造函数。

自动实现属性“AttackTraits.Distance”的后台字段必须在控制返回给调用者之前完全分配。 考虑从构造函数初始值设定项中调用默认构造函数。

我究竟做错了什么?

您通过Probability属性设置probability字段,但编译器不知道该属性设置字段…所以您需要显式初始化概率字段本身

 public AttackTraits(double probability, int damage, float distance) { this.probability = 0; Distance = distance; Damage = damage; } 

如果在具有自动属性的结构上看到这个错误,只需通过执行参数化构造函数调用无参数构造函数: this()示例如下:

 struct MyStruct { public int SomeProp { get; set; } public MyStruct(int someVal) : this() { this.SomeProp = someVal; } } 

通过从构造函数声明中调用this(),您可以让基础ValueType类初始化自动属性的所有后备字段。 我们无法在构造函数中手动执行,因为我们无法访问自动属性的后台字段。 ValueType是所有结构的基类。

尝试访问概率字段不访问者。 在这种情况下,自动道具也应该起作用。

没有办法让结构有无参数的构造函数,所以可以考虑把它改为class。

最佳做法是仅在16个字节或更less的string中使用结构,而且是不可变的。 所以如果你打算在创build之后改变对象字段,考虑重构它到类。

另外,您可以将构造函数定义更改为:

 construct(params) : this() 

这也将消除错误

Probability = probability更改为this.probability = probability

在将来为字段select一个不同的命名约定,就像你为参数所做的那样。 例如,用下划线前缀所有字段,所以你可以简单地调用它:

 _probability = probability; 

并很容易地看到发生了什么。

Interesting Posts