这是我想写的结构:
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'必须完全 在控制返回之前分配 呼叫者,召集者。考虑打电话给 构造函数的默认构造函数 初始化程序。
我做错了什么?
答案 0 :(得分:288)
如果在具有自动属性的结构上看到此错误,只需通过执行下面的: this()
示例从参数化参数中调用无参数构造函数:
struct MyStruct
{
public int SomeProp { get; set; }
public MyStruct(int someVal) : this()
{
this.SomeProp = someVal;
}
}
通过从构造函数声明中调用this this(),让基类ValueType类初始化自动属性的所有支持字段。我们无法在构造函数上手动执行此操作,因为我们无法访问自动属性的支持字段。 ValueType是所有结构的基类。
答案 1 :(得分:48)
尝试访问概率字段而不是访问者。在这种情况下,自动道具应该也可以。
结构体无法使用无参数构造函数,因此请考虑将其更改为类。
最佳做法是仅在结构为16个字节或更少且不可变时使用结构。因此,如果您要在创建后更改对象字段,请考虑将其重构为类。
此外,您可以将构造函数定义更改为:
construct(params) : this()
这也将删除错误
答案 2 :(得分:30)
您正在通过probability
属性设置Probability
字段,但编译器不知道该属性设置字段...因此您需要显式初始化概率字段本身< / p>
public AttackTraits(double probability, int damage, float distance)
{
this.probability = 0;
Distance = distance;
Damage = damage;
}
答案 3 :(得分:2)
将第Probability = probability
行更改为this.probability = probability
将来会为参数选择不同的字段命名约定。例如,使用下划线为所有字段添加前缀,因此您只需调用它:
_probability = probability;
轻松看看发生了什么。
答案 4 :(得分:0)
尝试将攻击特质
的结构更改为类public class AttackTraits
{
.........
{