为什么C#编译器强制在构造函数中显式初始化所有值类型的字段?

Sel*_*enç 2 c# struct

对于一个类,这没关系:

class Point
{
    private int _x, _y;

    public Point(int x)
    {
        _x = x;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用值类型,编译器会抱怨_y未初始化:

struct Point
{
    private int _x, _y;

    public Point(int x)
    {
        _x = x;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道这背后的理由是什么?为什么不能编译器只是初始化_y0时候有没有提供明确的构造,因为它呢?

Mar*_*ell 6

为什么?因为语言规范(ECMA 334 16.4.9)这样说:

在构造的结构的所有字段都已明确赋值之前,不能调用实例函数成员(包括属性X和Y的集合访问器).但请注意,如果Point是类而不是结构,则允许实例构造函数实现.

至于为什么语言规范要求它...大概是通过避免不必要的擦除和覆盖来使结构分配尽可能便宜.