Несколько дней назад, написав ответ на этот вопрос здесь, при переполнении, я немного удивился компилятору С#, который не делал то, что я ожидал от него делать. Посмотрите на следующие фрагменты кода:
Во-первых:
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> . Поскольку объект [] явно реализует интерфейс ICollection <object> , я ожидал, что два фрагмента будут скомпилированы до одного и того же IL и поэтому будут идентичными. Тем не менее, при выполнении тестов производительности на них я заметил, что последний был примерно в 6 раз быстрее прежнего.
После сравнения IL из обоих фрагментов я заметил, что оба метода были идентичны, за исключением инструкции IL castclass в первом фрагменте.
Удивленный этим, я теперь задаюсь вопросом, почему компилятор С# не является "умным" здесь. Вещи никогда не такие простые, как кажется, поэтому почему компилятор С# здесь немного наивен?