为什么在调用MSIL中的字段之前必须执行ldarg.0?

Jan*_*oom 22 cil field

我想调用一个函数,作为参数a string和a Int32.这string只是一个文字,Int32应该是一个field.所以我认为应该是这样的:

.method public hidebysig instance string TestVoid() cil managed
{
    .maxstack 1
    .locals init (
        [0] string CS$1$0000)
    L_0000: nop 
    L_0001: ldstr "myString"
    L_0006: ldfld int32 FirstNamespace.FirstClass::ByteField
    L_000b: call string [Class1]Class1.TestClass::Functie<int32>(string, int32)
    L_0010: ret 
}
Run Code Online (Sandbox Code Playgroud)

但这会引发错误,即这不是有效的代码.添加时

ldarg.0 
Run Code Online (Sandbox Code Playgroud)

ldfld它运行之前就好了.为什么会这样,这会让我在拥有更多领域时遇到麻烦?

小智 39

实例方法有一个名为"this"的隐式参数.它作为堆栈的第一个参数加载,因此你有"this"的ldarg.0.

  • 正如Joel Marcey所解释的那样,有一个隐含的第一个参数"this".有点像你声明一个扩展方法和include参数(这个targetType targetObject,...然后你不必引用它). (2认同)