8

以下は正常にコンパイルされます。

struct Foo {}

void Test()
{
    Foo foo;
    foo.ToString();
}

次の例では、「割り当てられていないローカル変数の使用」というコンパイル エラーが発生します。

struct Foo
{
    int i;
}

void Test()
{
    Foo foo;
    foo.ToString();
}

最初のケースでは、構造体にはメンバーがないため、初期化する必要がないという何らかの推論がコンパイラによって行われたようです。しかし、これが私にとって意味があるかどうかはわかりません。コンパイラは、foo変数を として初期化することを強制した可能性がありますnew Foo()

では、C# でアクセスする前にすべてのローカル変数を初期化する必要がある場合、最初の例がコンパイルされるのはなぜですか?

4

1 に答える 1

8

C# 5 仕様のセクション 5.3 では、次のように説明されています。

構造体型の変数は、そのインスタンス変数のそれぞれが確実に割り当てられていると見なされる場合、確実に割り当てられていると見なされます。

これは、インスタンス変数がない場合に自動的に当てはまります。したがって、変数は確実に割り当てられていると見なされ、ToString()呼び出しで使用できます。

于 2012-09-21T12:53:43.220 に答える