Oop CIL指令意外返回值

Oop CIL指令意外返回值,oop,stack,clr,cil,reflection.emit,Oop,Stack,Clr,Cil,Reflection.emit,我试图手动创建il指令以供学习,但遇到了一个小问题 我有一个简单的结构和一个接口:“MyInterface”和一个方法:“Handle”,一个名为“AddTwo”的类实现了“MyInterface”,还有一个“Program”类和一个entrymethod。il转储如下所示: .class interface public abstract auto ansi MyInterface<TInput,TOutput> { .method public hidebysig newsl

我试图手动创建il指令以供学习,但遇到了一个小问题

我有一个简单的结构和一个接口:“MyInterface”和一个方法:“Handle”,一个名为“AddTwo”的类实现了“MyInterface”,还有一个“Program”类和一个entrymethod。il转储如下所示:

.class interface public abstract auto ansi MyInterface<TInput,TOutput>
{
  .method public hidebysig newslot abstract virtual 
          instance !TOutput  Handle(!TInput A_1) cil managed
  {
  } // end of method MyInterface::Handle

} // end of class MyInterface

.class public auto ansi plusTwo
       extends [mscorlib]System.Object
       implements class MyInterface<int32,int32>
{
  .method public hidebysig newslot virtual final 
          instance int32  Handle(int32 x) cil managed
  {
    // Code size       13 (0xd)
    .maxstack  2
    IL_0000:  ldarg      0
    IL_0004:  nop
    IL_0005:  nop
    IL_0006:  ldc.i4     0x2
    IL_000b:  add
    IL_000c:  ret
  } // end of method plusTwo::Handle
 } // end of class plusTwo

.class public auto ansi Program
       extends [mscorlib]System.Object
{
  .method public static int32  Main() cil managed
  {
    .entrypoint
    // Code size       34 (0x22)
    .maxstack  2
    .locals init (int32 V_0)
    IL_0000:  newobj     instance void plusTwo::.ctor()
    IL_0005:  ldc.i4     0xa
    IL_000a:  callvirt   instance !1 class MyInterface<int32,int32>::Handle(!0)
    IL_000f:  stloc      V_0
    IL_0013:  nop
    IL_0014:  nop
    IL_0015:  ldloc      V_0
    IL_0019:  nop
    IL_001a:  nop
    IL_001b:  ldc.i4     0x5
    IL_0020:  add
    IL_0021:  ret
  } // end of method Program::Main
} // end of class Program
类接口公共抽象自动ansi MyInterface { .method公共隐藏新闻组摘要虚拟 实例!TOutput句柄(!TInput A_1)cil托管 { }//方法MyInterface::Handle的结尾 }//类MyInterface的结尾 .class公共自动ansi plusTwo 扩展[mscorlib]System.Object 实现类MyInterface { .method公共隐藏新闻组虚拟最终版 实例int32句柄(int32 x)cil托管 { //代码大小13(0xd) .maxstack 2 IL_0000:ldarg 0 IL_0004:没有 IL_0005:没有 IL_0006:ldc.i4 0x2 IL_000b:添加 IL_000c:ret }//方法plusTwo::Handle的结尾 }//类结束plusTwo .class公共自动ansi程序 扩展[mscorlib]System.Object { .method public static int32 Main()cil managed { .入口点 //代码大小34(0x22) .maxstack 2 .locals init(int32 V_0) IL_0000:newobj实例void plusTwo::.ctor() IL_0005:ldc.i4 0xa IL_000a:callvirt实例!1类MyInterface::Handle(!0) IL_000f:stloc V_0 IL_0013:没有 IL_0014:没有 IL_0015:ldloc V_0 IL_0019:没有 IL_001a:没有 IL_001b:ldc.i4 0x5 IL_0020:添加 IL_0021:ret }//方法程序结束::Main }//课程结束
在上面的例子中,我期望输出为:17,但是我得到的是一个随机的高整数,它随着每次测试而变化。看起来像是内存地址之类的。有人能通过查看上面生成的IL来判断问题是什么吗?任何帮助都将不胜感激。

ldarg 0为实例方法生成this指针。将其设置为静态方法或使用ldarg 1。否则,通过先用C#编写代码并查看编译器生成的IL,您总能发现一些东西。@HansPassant:这就成功了,非常感谢。你应该把这个贴出来作为答案。