我有以下代码:
public struct Interval
{
public double Min { get; set; }
public double Max { get; set; }
public Interval(double min = double.MinValue, double max = double.MaxValue)
{
Min = min;
Max = max;
}
}
编译器抱怨
自动备份字段 已实施的财产必须完整 在控制返回之前分配 呼叫者,召集者。考虑打电话给 构造函数的默认构造函数 初始化程序。
这是我不理解的,因为我的构造函数正在完全初始化此结构的值。不是吗?
答案 0 :(得分:7)
您的构造函数正在尝试设置属性 - 在知道所有字段已初始化之前,它无法执行此操作。 (在明确分配所有结构的字段之前,您无法调用任何实例方法或访问任何属性。)当您使用自动实现的属性时,它会显示一个怪癖:您拥有除了通过以外无法访问的字段属性,但在为字段赋值之前不能使用该属性!修复很简单 - 只需添加对无参数构造函数的调用:
public Interval(double min = double.MinValue, double max = double.MaxValue)
: this()
{
Min = min;
Max = max;
}
这是有效的,因为无参数构造函数会将默认值分配给所有字段,之后您可以毫无问题地使用这些属性。
但是,我建议首先不要使用可变结构。
答案 1 :(得分:2)
注意错误消息并添加对默认构造函数的调用,如下所示:
public Interval(
double min = double.MinValue,
double max = double.MaxValue
)
: this() {
Min = min;
Max = max;
}
问题在于写入后备字段未初始化;这让编译器非常不满意。但是,默认的无参数构造函数将为您初始化这些字段,这就是当我们将调用链接到该构造函数时问题消失的原因。
答案 2 :(得分:0)
将此()添加到ctor:
public Interval(...args...) : this() {
... Code ...
}
答案 3 :(得分:0)
我刚回来写了几天。
http://www.abhisheksur.com/2010/10/hidden-facts-on-c-constructor-in.html
如果为结构编写构造函数,则需要在从构造函数返回之前初始化结构的每个成员。备份字段可能会对您的代码产生一些问题,您可以使用对Default构造函数的调用来修复它。
此()
答案 4 :(得分:-2)
它编译对我很好:http://ideone.com/mgBpt
您使用的是哪个版本的C#和编译器?