Подтвердить что ты не робот

Почему мне нужно делать ldarg.0 перед вызовом поля в MSIL?

Я хочу вызвать функцию с параметрами a string и 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 
}

Но это порождает ошибку, что это недопустимый код. При добавлении

ldarg.0 

до ldfld он работает отлично. Почему это, и это приведет меня в неприятности, когда у вас больше полей?

4b9b3361

Ответ 1

Методы экземпляров имеют неявный параметр, называемый "this". Он загружается как первый аргумент в стек, поэтому у вас есть ldarg.0 для "this".