3

我有以下代码:

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

这段代码运行良好。为什么?覆盖默认构造函数是否未应用于结构?使用参数化构造函数是否覆盖了默认构造函数?

4

4 回答 4

5

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

使用结构(C# 编程指南)

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

如果您真的想要求您的数据类型的用户调用自定义构造函数,则必须改用类。

于 2013-11-03T08:47:19.257 回答
1

http://msdn.microsoft.com/en-us/library/aa288208%28v=vs.71%29.aspx

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

一些很好的解释 为什么我不能在 .NET 中为结构定义默认构造函数?

于 2013-11-03T08:46:49.300 回答
1

结构总是有一个默认的无参数构造函数,你不能覆盖它。 MSDN稍微解释一下。存在这个(和其他)限制,因为结构是值类型。如果您需要像对象一样使用它们,请使用对象:)

于 2013-11-03T08:47:23.960 回答
0

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

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

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'
    } 
}
于 2013-11-03T08:56:46.417 回答