以下C#
代码:
short first = 1;
short second = 2;
bool eq1 = (first.Equals(second));
代码转换为:
IL_0001: ldc.i4.1
IL_0002: stloc.0 // first
IL_0003: ldc.i4.2
IL_0004: stloc.1 // second
IL_0005: ldloca.s 00 // first
IL_0007: ldloc.1 // second
IL_0008: call System.Int16.Equals
IL_000D: stloc.2 // eq1
ldloca.s 00
- 使用索引indx,短格式加载局部变量的地址。
ldloc.1
- 将局部变量1加载到堆栈上。
为什么两个命令都不是ldloca.s
,(两个变量都属于short
类型)?
答案 0 :(得分:8)
值类型的所有实例方法都有this
类型的隐式ref T
参数,而不是T
类型的参数,这就是first
变量需要{的原因{1}}。但ldloca
的参数属于System.Int16.Equals
类型,没有任何System.Int16
,因此您的ref
变量不需要(且无法传递) second
。