15

ジェネリックを使用する次のstruct定義があるとします。

public struct Foo<T>
{
    public T First; 
    public T Second;

    public Foo(T first)
    {
        this.First = first;
    }

}

コンパイラは言う

コントロールが呼び出し元に返される前に、「Foo.Second」を完全に割り当てる必要があります

ただし、Fooがクラスの場合は、正常にコンパイルされます。

public class Foo<T>
{
    public T First; 
    public T Second;

    public Foo(T first)
    {
        this.First = first;
    }

}

なんで?コンパイラがそれらを異なる方法で扱うのはなぜですか? さらに、最初にコンストラクターが定義されていない場合は、Fooコンパイルされます。なぜこの振る舞いをするのですか?

4

4 に答える 4

21

これは、制御がコンストラクターから離れる前に、構造体のすべてのフィールドを割り当てる必要があることをコンパイラ規則が強制するためです。

これを行うことで、コードを機能させることができます。

public Foo(T first)
{
    this.First = first;
    this.Second = default(T);
}

また、「C# 構造体のすべてのフィールドをデフォルト以外のコンストラクターで初期化する必要があるのはなぜですか?」も参照してください。

于 2012-12-05T20:30:08.523 に答える
15

これは一般に構造体の要件です。ジェネリックとは関係ありません。コンストラクターは、すべてのフィールドに値を割り当てる必要があります。

ここで同じエラーが発生することに注意してください。

struct Foo
{
    public int A;
    public int B;

    public Foo()
    {
        A = 1;
    }
}
于 2012-12-05T20:29:16.527 に答える
2

C# では、すべてのフィールドを構造体 (インラインまたはコンストラクター) に割り当てる必要があるという規則があるためです。これは、構造体の性質によるものです。ジェネリックかどうかについては何もありません。

于 2012-12-05T20:30:11.627 に答える
0

他の回答は動作を正しく説明していますが、質問の2番目の部分について言及することを怠っているため、ここで完了です。

クラスの場合、コンストラクターを明示的に定義しない場合、コンパイラーはデフォルト値 (nullオブジェクト、0数値など) をすべてのフィールドに割り当てるデフォルトのコンストラクターを生成します。

構造体の場合、構造体には常に、既定値を割り当てる暗黙的なパラメーターなしのコンストラクターがあります。

于 2012-12-05T20:34:19.120 に答える