struct的构造函数问题(编译器大喊我没有完全初始化所有struct的自动属性)

时间:2010-10-17 17:33:26

标签: c# .net automatic-properties

我有以下代码:

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;
    }
}

编译器抱怨

  

自动备份字段   已实施的财产必须完整   在控制返回之前分配   呼叫者,召集者。考虑打电话给   构造函数的默认构造函数   初始化程序。

这是我不理解的,因为我的构造函数正在完全初始化此结构的值。不是吗?

5 个答案:

答案 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#和编译器?