o = i; // Implicit boxing i = 456; // Change the contents of i Console.WriteLine("The value-type value = {0}", i); Console.WriteLine("The object-type value = {0}", o); } } 输出 The value-type value = 456 The object-type value = 123
取消装箱 取消装箱是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。取消装箱操作包括:
检查对象实例,确保它是给定值类型的一个装箱值。 将该值从实例复制到值类型变量中。 以下语句同时说明了装箱和取消装箱操作:
int i = 123; // A value type object box = i; // Boxing int j = (int)box; // Unboxing 下图显示了以上语句的结果。
取消装箱转换 在堆栈上 在堆上 i 123 int i=123; o (将i装箱) object o=i; int 123 j 123 int j=(int) o; 为使到给定值类型的取消装箱转换在运行时取得成功,源参数的值必须是对某个对象的引用,而该对象先前是通过将该值类型的值装箱创建的。如果源参数为 null 或是对一个不兼容对象的引用,则会引发 InvalidCastException。 示例 下面的示例阐释无效取消装箱的情况,即错误的取消装箱如何导致 InvalidCastException。通过使用 try 和 catch,发生错误时会显示错误信息。 using System; public class UnboxingTest { public static void Main() { int intI = 123; // Boxing object o = intI; // Reference to incompatible object produces InvalidCastException try { int intJ = (short) o; Console.WriteLine("Unboxing OK."); } catch (InvalidCastException e) { Console.WriteLine("{0} Error: Incorrect unboxing.",e); } } } 输出 System.InvalidCastException at UnboxingTest.Main() Error: Incorrect unboxing. 如果将下列语句: int intJ = (short) o; 更改为: int intJ = (int) o; 转换将执行,而您将得到输出“Unboxing OK”。
上一页 [1] [2] [3] [4] |