由於值類型都是 ValueType 類型,而 ValueType 頁繼承了 Object(CLR 內部處理),因此值類型能夠轉爲 Object類型。面試
看以下示例:ide
internal class Program { public static void Main(string[] args) { int i = 100; object numObj = i; // 裝箱 int j = (int) numObj; // 拆箱 Console.WriteLine(j); // 100 } }
咱們查看它生成的 IL 語言:spa
1 .method public hidebysig static void Main(string[] args) cil managed 2 { 3 .entrypoint 4 .maxstack 1 5 .locals init ( 6 [0] int32 num, 7 [1] object obj2, 8 [2] int32 num2) 9 L_0000: nop 10 L_0001: ldc.i4.s 100 11 L_0003: stloc.0 12 L_0004: ldloc.0 13 L_0005: box int32 14 L_000a: stloc.1 15 L_000b: ldloc.1 16 L_000c: unbox.any int32 17 L_0011: stloc.2 18 L_0012: ldloc.2 19 L_0013: call void [mscorlib]System.Console::WriteLine(int32) 20 L_0018: nop 21 L_0019: ret 22 }
對比看其實很直觀,在第 13 行經過 box int32 給咱們編寫的 int 類型的 100 裝箱爲 object 對象,而在 16 行經過 unbox.any int32 將 object 類型的對象拆箱爲 int 類型。調試
一、下面三句代碼有沒有錯?code
1 int i = 10; 2 object obj = i; 3 int j = obj;
答案:很明顯上面代碼使用錯誤的,由於拆箱(將 Object 類型的變量賦值給值類型)須要作顯示轉換,而第 3 行並無。對象
二、下面代碼會不會報錯?爲何報錯?blog
1 int i = 5; 2 object obj = i; 3 int j1 = (int) obj; 4 long j2 = i; 5 long j3 = (long) i; 6 long j4 = (long) obj;
答案:先直接調試看結論:繼承
顯然,報錯在第 6 行,緣由是裝箱到 obj 對象的變量 i 爲 int 類型,而拆箱時使用的是 long 類型,雖然 int 類型能夠隱式轉換爲 long 類型,但作拆箱時,只能以裝箱時的類型進行拆箱。ip