単純です...コンパイラは、ローカル変数を使用する前に初期化するように要求するためです。これにより、初期化の失敗に関連するすべてのカテゴリのミスを防ぐことができます。
次のいくつかのステートメントから生成されたILを見ると:
int x;
Console.WriteLine("hello");
int y=5;
x=6;
Console.WriteLine(x+y);
次のように表示されます。
//notice no ops related to x prior to console.writeline
IL_0000: ldstr "hello"
IL_0005: call System.Console.WriteLine
IL_000A: ldc.i4.5
IL_000B: stloc.1 //create/store y
IL_000C: ldc.i4.6
IL_000D: stloc.0 //x is really only created right here
IL_000E: ldloc.0
IL_000F: ldloc.1
IL_0010: add
IL_0011: call System.Console.WriteLine
ILに格納する前にxの値が表示されている場合、それはデバッガーのトリックです。