几天前,在stackoverflow上为这个问题写答案时,我对C#编译器感到有点惊讶,因为它没有按照我预期的那样工作。请看以下两段代码:
第一段:
object[] array = new object[1];
for (int i = 0; i < 100000; i++)
{
ICollection<object> col = (ICollection<object>)array;
col.Contains(null);
}
第二点:
object[] array = new object[1];
for (int i = 0; i < 100000; i++)
{
ICollection<object> col = array;
col.Contains(null);
}
两个代码片段之间唯一的区别在于对ICollection<object>
的强制转换。由于object[]
显式地实现了 ICollection<object>
接口,我本以为这两个代码片段会编译成相同的IL代码,从而达到完全相同的效果。然而,在对它们进行性能测试时,我发现后者比前者快了约6倍。
在比较两个代码片段的IL代码后,我发现两种方法是相同的,除了第一个代码片段中的一个castclass
指令。
对此感到惊讶,我现在想知道为什么C#编译器在这里不是“聪明”的。事情并不像看起来那么简单,所以为什么C#编译器在这里有点天真呢?