il指令中,call一个构造函数和newobj一个对象的结果为啥不一样?(了解IL的情帮助)
.assembly extern mscorlib { auto }
.assembly extern System { auto }
.assembly MyApp {}
.class MyClass
{
   .field int32 X    
   .method public specialname void .ctor()
   {   
     ldarg.0
     call instance void [mscorlib]System.Object::.ctor()      
     ldarg.0
     ldc.i4 10
     stfld int32 MyClass::X              
     ret
   }
}
.method static void Test()
{
     .locals init (class MyClass mc)
      //***********************************
      ldloca mc
      call instance void MyClass::.ctor()
      ldloc mc
      ldfld int32 MyClass::X   ///---这句会报错“Object reference not set to an instance of an object.“
      //***********************************
      pop
      ret
}
如果我把上面框住的换成这样
      //***********************************
      ldloca mc
      call instance void MyClass::.ctor()
      ldloca mc      //这里换成了ldloca
      ldfld int32 MyClass::X         
      //***********************************
就可以通过了,为什么呢?
另外如果我换成
      //***********************************
      newobj instance void MyClass::.ctor()
      stloc mc      
      ldloc mc
      //ldloca mc
      ldfld int32 MyClass::X         
      //***********************************
那么无论是ldloc mc 还是ldloca mc 都可以通过,为什么呢?
------解决方案--------------------
两个ldloca居然能通过,不解。。。
MSIL code
     //***********************************
     ldloc mc      //这里换成了ldloc
     call instance void MyClass::.ctor()
     ldloc mc      //这里不变
     ldfld int32 MyClass::X
     //***********************************