為什麼會這樣呢?讓我們從IL代碼中看看編譯器是如何理解此時的Main的:
// Code #05
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code Size: 50 byte(s)
.maxstack 2
.locals (
CsWritingLab.Alignment alignment1,
CsWritingLab.Alignment alignment2)
L_0000: nop
L_0001: ldc.i4.0
L_0002: stloc.0
L_0003: ldloc.0
L_0004: box CsWritingLab.Alignment
L_0009: ldstr "D"
L_000e: call instance string [mscorlib]System.Enum:string)
L_0013: call void [mscorlib]System.Console::WriteLine(string)
L_0018: nop
L_0019: ldc.i4.1
L_001a: stloc.1
L_001b: ldloc.1
L_001c: box CsWritingLab.Alignment
L_0021: ldstr "D"
L_0026: call instance string [mscorlib]System.Enum:string)
L_002b: call void [mscorlib]System.Console::WriteLine(string)
L_0030: nop
L_0031: ret
}
從上面的IL代碼中,我們可以看出這兩種初始化方式已經不再被理解為一樣的了。對比Code #03和Code #05,你會發現,改變的僅僅是L_0019行:
ldc.i4.0 -> ldc.i4.1
也就是說,使用枚舉的第一個成員來初始化枚舉變量,編譯器懂得根據枚舉的定義來作出相應的調整,從而編譯出符合我們預期的代碼。這種處理方式實際上使用了多態性的思維。
而此時,
Alignment a = new Alignment();
相當於
Alignment a = (Alignment)0;
或者
Alignment a = 0;