Это не связано с компилятором C #, IL идентичен. Вы нашли ошибку в оптимизаторе джиттера .NET 4.0. Вы можете воспроизвести его в Visual Studio. Инструменты + Параметры, Отладка, Общие, снимите флажок «Подавить оптимизацию JIT при загрузке модуля» и запустите сборку выпуска, чтобы воспроизвести ошибку.
Я еще недостаточно внимательно изучил его, чтобы определить ошибку. Это выглядит очень странно, оно содержит метод и полностью пропускает код для преобразования в бокс. Машинный код существенно отличается от кода, сгенерированного джиттером версии 2.
Чистый обходной путь не так прост, вы можете сделать это, подавив встраивание. Как это:
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public bool IsDateTime(object o) {
return o is DateTime;
}
Вы можете сообщить об ошибке на connect.microsoft.com. Дай мне знать, если не хочешь, и я позабочусь об этом.
Неважно, это было уже сделано . Это не было исправлено в техническом выпуске, который был включен в VS2010 SP1.
Эта ошибка была исправлена, я больше не могу ее воспроизвести. Моя текущая версия clrjit.dll - 4.0.30319.237 от 17 мая 2011 года. Я не могу точно сказать, какое обновление его исправило. 5 августа 2011 года я получил обновление для системы безопасности, обновившее clrjit.dll до версии 235 с датой 12 апреля, которая будет самой ранней.