IL代码将Int16加载为Int32

时间:2014-09-30 08:47:06

标签: c# il

以下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类型)?

1 个答案:

答案 0 :(得分:8)

值类型的所有实例方法都有this类型的隐式ref T参数,而不是T类型的参数,这就是first变量需要{的原因{1}}。但ldloca的参数属于System.Int16.Equals类型,没有任何System.Int16,因此您的ref变量不需要(且无法传递) second