暗黙の引数がなぜか動作

ラムダ式の引数をいちいち書くのがじゃんくさいから$1とかで引数にアクセスできるようにしてみた
ひさびさにレキサをちょっと変更して名前解決の時に$1をArgumentsにぶちこむようなコードだけ書いたところ・・・なぜか完成した
なんでや、ILでは引数1個の関数をなんで呼び出し側が引数3個でうまく動くねん!

f:id:zenu:20180609223217p:plain

この時ILはこうなっていた
なるほど引数が違う関数ポインタをInvokeしてもおちないんだ・・・ええんか、これ?
.NETの呼び出し規約は呼び出し側が引数をpopするのか?よく分かんないや

f(=> print($1))
↓
newobj     instance void 'Bind_#5,0'::.ctor()
stloc.0
ldloc.0
ldftn      void 'implicit_param2.#5,0'(int32)
stfld      native int 'Bind_#5,0'::f
ldloc.0
ldftn      instance void 'Bind_#5,0'::Invoke(int32)
newobj     instance void class [mscorlib]System.Action`1<int32>::.ctor(object, native int)
call       void implicit_param2.f(class [mscorlib]System.Action`3<int32,string,int32>)