为什么我必须在struct的构造函数中分配所有字段?

eKe*_*ek0 4 c# initialization

重复:

为什么我必须使用非默认构造函数初始化C#结构中的所有字段?


如果在结构的构造函数中

internal struct BimonthlyPair
{
    internal int year;
    internal int month;
    internal int count;    

    internal BimonthlyPair(int year, int month)
    {
        this.year = year;
        this.month = month;
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有初始化字段(在这种情况下计数)我收到一个错误:

在将控制权返回给调用者之前,必须完全分配字段'count'

但是,如果我在这种情况下分配所有字段,包括计数

this.year = year;
this.month = month;
this.count = 0;
Run Code Online (Sandbox Code Playgroud)

错误消失了.

我认为这是因为当有人创建一个新的struct对象时,C#不会初始化struct字段.但为什么?据我所知,它在其他一些情境中初始化变量,那么为什么一个结构是一个不同的风景呢?

ang*_*son 8

当您使用默认构造函数时,隐式保证结构的整个值被清除.

当您创建自己的构造函数时,您继承了该保证,但没有强制执行它的代码,因此您需要确保整个结构具有值.


Vad*_*dim 7

我不能回答为什么.但你可以通过使用:this()来修复它.

internal struct BimonthlyPair
{
    internal int year;
    internal int month;
    internal int count;

    internal BimonthlyPair(int year, int month)
        : this()  // Add this()
    {
        this.year = year;
        this.month = month;
    }
}
Run Code Online (Sandbox Code Playgroud)