由于值类型都是 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