Nic*_*ner 106 c# constructor struct
这是我想写的结构:
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; }
}
Run Code Online (Sandbox Code Playgroud)
这会导致以下编译错误:
在分配所有字段之前,不能使用"this"对象
在将控制权返回给调用者之前,必须完全分配字段'AttackTraits.probability'
在将控制权返回给调用者之前,必须完全分配自动实现的属性"AttackTraits.Damage"的备份字段.考虑从构造函数初始化程序中调用默认构造函数.
在将控制权返回给调用者之前,必须完全分配自动实现的属性"AttackTraits.Distance"的备份字段.考虑从构造函数初始化程序中调用默认构造函数.
我究竟做错了什么?
Chr*_*ckx 294
如果在具有自动属性的结构上看到此错误,只需通过: this()以下示例从参数化的构造函数中调用无参数构造函数:
struct MyStruct
{
public int SomeProp { get; set; }
public MyStruct(int someVal) : this()
{
this.SomeProp = someVal;
}
}
Run Code Online (Sandbox Code Playgroud)
通过从构造函数声明中调用this(),您可以让基类ValueType类初始化自动属性的所有支持字段.我们无法在构造函数上手动执行此操作,因为我们无法访问自动属性的支持字段.ValueType是所有结构的基类.
vit*_*ore 51
尝试访问概率字段而不是访问者.在这种情况下,自动道具应该也可以.
结构体无法使用无参数构造函数,因此请考虑将其更改为类.
最佳做法是仅在结构为16个字节或更少且不可变时使用结构.因此,如果您要在创建后更改对象字段,请考虑将其重构为类.
此外,您可以将构造函数定义更改为:
construct(params) : this()
Run Code Online (Sandbox Code Playgroud)
这也将删除错误
Tho*_*que 31
您正在probability通过Probability属性设置字段,但编译器不知道该属性设置字段...因此您需要显式初始化概率字段本身
public AttackTraits(double probability, int damage, float distance)
{
this.probability = 0;
Distance = distance;
Damage = damage;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
58283 次 |
| 最近记录: |