相关疑难解决方法(0)

CIL unbox_any指令 - 奇怪的行为

.method public static void  Test<class T>(object A_0) cil managed
{
  // Code size       13 (0xd)
  .maxstack  1
  .locals init (!!T V_0)
  IL_0000:  ldarg.0
  IL_0001:  isinst     !!T
  IL_0006:  unbox.any  !!T
  IL_000b:  stloc.0
  IL_000c:  ret
} // end of method DemoType::Test
Run Code Online (Sandbox Code Playgroud)

相同的C#代码是:

public static void Test<T>(object o) where T : class
{
    T t = o as T;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 为什么unbox.any被称为?如果你这样做

     var a = father as child 
    
    Run Code Online (Sandbox Code Playgroud)

    isinst intruction将调用而不是unbox.any,如果我将删除泛型定义并且我将尝试将(isinst)对象强制转换为某个类,则不会调用unbox.any.

  2. 也许因为泛型定义而调用unbox.any,所以在这种情况下unbox.any需要抛出NullReferenceException,因为isinst指令的答案为此转换返回null.请参阅unbox_any.如果您尝试运行此代码,您将看到没有抛出任何异常.

更新

我可以理解unbox_any因为对象类型参数,它尝试在isinst检查后将其强制转换为具体类型.也许仿制药也会影响.

我的问题是,为什么不在unbox.any中抛出异常,如果我们尝试unbox到T的obj是null?

文档说:"如果obj是一个空引用,则抛出NullReferenceException."

.net clr il cil nullreferenceexception

5
推荐指数
1
解决办法
258
查看次数

标签 统计

.net ×1

cil ×1

clr ×1

il ×1

nullreferenceexception ×1