首页 > 解决方案 > C# 10 中的结构无参数构造函数和字段初始值设定项

问题描述

C# 10 可以为结构声明无参数构造函数和字段初始值设定项。根据语言参考,当您声明字段初始值设定项但没有显式无参数构造函数时,会发生以下情况:

如果不显式声明无参数构造函数,则结构类型提供无参数构造函数,其行为如下:

  • 如果结构类型具有显式实例构造函数或没有字段初始值设定项,则隐式无参数构造函数会生成结构类型的默认值,而不考虑字段初始值设定项 (...)。

  • 如果结构类型没有显式实例构造函数并且具有字段初始化器,则编译器会合成一个公共无参数构造函数来执行指定的字段初始化 (...)。

以下代码输出1

struct S {
    public int X = 1;
}

class Program {
    static void Main() { System.Console.WriteLine(new S().X); }
}

以下代码输出0

struct S {
    public int X = 1;
    public S(int x) { X = x; }
}

class Program {
    static void Main() { System.Console.WriteLine(new S().X); }
}

这完全符合上面引用的规范,但我觉得这不合逻辑,所以我的问题是:为什么?为什么隐式无参数构造函数会根据是否有其他实例构造函数有不同的行为?为什么即使有其他实例构造函数,它也不能总是考虑字段初始值设定项?

标签: c#structdefault-constructorc#-10.0

解决方案


推荐阅读