1

我有以下代码:

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

编译器抱怨说

在将控制权返回给调用者之前,必须完全分配自动实现属性的支持字段。考虑从构造函数初始化器调用默认构造函数。

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

4

5 回答 5

7

您的构造函数正在尝试设置属性- 在它知道所有字段都已初始化之前它无法执行此操作。(在明确分配所有结构的字段之前,您不能调用任何实例方法或访问任何属性。)这是一个怪癖,当您使用自动实现的属性时会表现出来:您拥有除了通过之外无法访问的字段属性,但在为字段赋值之前不能使用该属性!修复很简单 - 只需添加对无参数构造函数的调用:

public Interval(double min = double.MinValue, double max = double.MaxValue)
    : this()
{
    Min = min;
    Max = max;
}

这是因为无参数构造函数为所有字段分配了默认值,之后您可以毫无问题地使用这些属性。

但是,我首先建议不要使用可变结构。

于 2010-10-17T17:35:52.647 回答
2

注意错误消息并添加对默认构造函数的调用,如下所示:

public Interval(
    double min = double.MinValue,
    double max = double.MaxValue
)
    : this() {
        Min = min;
        Max = max;
}

问题是所写的支持字段没有初始化。这使编译器非常不高兴。但是,默认的无参数构造函数将为您初始化这些字段,这就是当我们链接到该构造函数的调用时问题消失的原因。

于 2010-10-17T17:35:12.437 回答
0

将 :this() 添加到ctor:

public Interval(...args...) : this() {
    ... Code ...
}
于 2010-10-17T17:36:09.230 回答
0

前几天刚写的。

http://www.abhisheksur.com/2010/10/hidden-facts-on-c-constructor-in.html

如果为结构编写构造函数,则需要在从构造函数返回之前初始化结构的每个成员。支持字段可能会在您的代码中产生一些问题,您可以使用对 Default 构造函数的调用来修复它。

这个()

于 2010-10-17T18:25:14.450 回答
-2

它对我来说编译得很好:http: //ideone.com/mgBpt

您使用的是什么版本的 C# 和编译器?

于 2010-10-17T17:35:58.173 回答