几天前,当我在溢出时为这个问题写一个答案时,我对 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
第一个片段中的 IL 指令。
对此感到惊讶,我现在想知道为什么 C# 编译器在这里不“聪明”。事情从来没有看起来那么简单,那么为什么 C# 编译器在这里有点幼稚呢?