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, подлежит исправлению в следующий выпуск .