欲验证的结论: 接口引用指向装箱后的值类型时无需拆箱 。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| interface SomeInterface
{ void MethodInInterface(); }
struct OneValueType : SomeInterface
{ public void MethodInInterface()
{ Console.WriteLine("get called"); } }
class TestUnBox
{ public static void Main()
{ }
private static void CastStruct()
{ OneValueType ovt = new OneValueType();
object o = ovt;
((OneValueType) o).MethodInInterface(); }
private static void CastInterface()
{ OneValueType ovt = new OneValueType();
object o = ovt;
((SomeInterface) o).MethodInInterface(); } }
|
其中 OneValueType 是值类型,它实现了 SomeInterface 。
两个方法 CastStruct 和 CastInterface 分别把装箱之后的值类型转型为 OneValueType 和
SomeInterface 。预计的结果是第二个方法无需拆箱,查看 IL 来验证:
这是 CastStruct ():
这是 CastInterface ():
可见,第二个方法中没有 unbox 指令,结论得证。
2009 年 7 月 29 日