C# 尽管重写了Struct默认构造函数,但仍将使用它

C# 尽管重写了Struct默认构造函数,但仍将使用它,c#,struct,C#,Struct,我有以下代码: struct Person { public readonly int x; public Person( int x ) { this.x = x; } } class Program { static void Main(string[] args) { Person p = new Person(

我有以下代码:

struct Person
    {
        public readonly int x;

        public Person( int x )
        {
            this.x = x;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            Console.Write(p.x);
        } 
    }
这个代码很好用,为什么?重写默认构造函数是否未应用于结构? 使用参数化构造函数是否覆盖了默认构造函数?

结构不能包含显式无参数构造函数。结构成员将自动初始化为其默认值

一些好的解释
您没有覆盖默认构造函数;您刚刚提供了一个接受一个参数的重载。与类不同,拥有结构的参数化构造函数并不意味着默认构造函数不会自动生成。C#编译器自动为结构提供默认的无参数构造函数,并且不允许您用自己的构造函数重写它。这就是结构的本质

为结构定义默认(无参数)构造函数是错误的。初始化结构体中的实例字段也是错误的。只能通过使用参数化构造函数或在声明结构后单独访问成员来初始化结构成员。任何私有或其他不可访问的成员只能在构造函数中初始化


如果您确实想要求数据类型的用户调用自定义构造函数,则必须使用类来代替。

结构将始终具有默认的无参数构造函数,您不能忽略它。
解释一下。这种(和其他)限制是存在的,因为结构是值类型。如果需要像对象一样使用它们,请使用objects:)

在代码中,您不是调用您创建的构造函数,而是调用默认构造函数

要调用覆盖的构造函数,请尝试以下代码:

struct Person
{
    public readonly int x;

    public Person( int x )
    {
        this.x = x;
    }
}

class Program
{
    static void Main(string[] args)
    {
        int v = 9;

        Person p = new Person(v);
        Console.Write(p.x); // will output '9'
    } 
}

@SonerGönül它工作得很好。但我问的是,使用参数化构造函数是否会覆盖默认构造函数是的,我知道。但我问添加参数化构造函数是否会覆盖默认构造函数。实际上,零参数构造函数“public Person(){…}”并不存在。C#编译器不会生成它!缺点是C#编译器总是将所有值类型的
new X()
视为与
default(X)
相同。因此使用
X
的值,其中所有实例字段均为零/null/etc。实际上没有运行任何构造函数代码。