Если утверждение, кажется, оценивается, даже если условие оценивается как ложное

Late At Work прошлой ночью, мы пытались выяснить, почему что-то выходило из строя. Проверка валидации не удалась, хотя этого не должно было быть.

Мы закончили тем, что добавили оператор печати к этому коду (дизассемблированный из Reflector, чтобы проверить, действительно ли код был написан нами):

public static string Redacted(string name, DateTime lastModified)
{
    long ticks = lastModified.Ticks;
    if ((ticks != (ticks - (ticks % 10000L))) &&
            (lastModified != DateTime.MaxValue))
    {
        Log.Debug(string.Format("Last Modified Date = '{0}'. Ticks = '{1}'. TicksCalc = '{2}'",
            lastModified.ToString("dd/MM/yyyy hh:mm:ss.fff"),
            ticks, ticks - (ticks % 10000L)));

Он напечатал (переформатировал):

Last Modified Date = '22/03/2011 12:16:22.000'.
Ticks     = '634363497820000000'.
TicksCalc = '634363497820000000'            

Но условие таково: " ticks "(что равно тикам, указанным выше) не равно"

Я видел, как подобные вещи происходили раньше, когда их наблюдал отладчик, из-за того, что отладчик заставлял некоторые вещи оценивать, но это происходит независимо от того, используется отладчик или нет.

Кроме того, это происходит только в Release режим (т.е. с включенной оптимизацией JIT).

Вот дизассемблированные методы для обеих версий: работает , не работает . Я не умею читать сборку, поэтому отправляю их сюда в надежде на разъяснение.

Я надеюсь, что ответ не является чем-то очевидным, что я полностью упустил ...!

Редактировать: Вот ИЛ. Я не думаю, что с этим что-то не так, потому что он декомпилируется до правильного C #:

Обновление :

Подтверждено как ошибка Microsoft, подлежит исправлению в следующий выпуск .

12
задан porges 31 October 2013 в 02:20
поделиться