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

デフォルトのコンストラクターをオーバーライドしませんでした。1 つのパラメーターを受け入れるオーバーロードを指定しました。クラスとは異なり、構造体にパラメーター化されたコンストラクターがあるからといって、既定のコンストラクターが自動的に生成されないわけではありません。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 に答える