结构构造函数:“控制返回给调用者之前,必须完全分配字段”。
这里是我想写的一个结构:
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;
并很容易地看到发生了什么。