Подтвердить что ты не робот

Странное различие между .net 3.5 и .net 4.0

У меня есть код

byte[] bytes = new byte[] { 0x80, 1, 192, 33, 0 };

if (bytes[0] != 0x80 || ((bytes[1] & ~1) != 0) || bytes[4] != 0)
{
//signature wrong (.net 4.0 result)
}
else
{
//signture okay (.net 3.5 result)
}

В выражении .net 3.5 выражение оценивается как false, но в 4.0 оно оценивается как true. Почему мой вопрос? и как я могу проверить весь мой старый (.net 3.5) код, чтобы предотвратить это поведение?

4b9b3361

Ответ 1

Поэтому он не потерян в комментариях, Я считаю, что вы попали в ошибку в RyuJIT, новом компиляторе JIT для 64-разрядных приложений в .NET 4.6.

Это не первый, например, см. это сообщение в блоге, в котором показано, как команда Qaru отслеживает еще одну проблему.

Как обсуждалось в комментариях, это не срабатывает, если вы нацеливаете .NET 3.5, а также не нацеливаете x86 на .NET 4.

Эта ошибка может быть или не указана в Microsoft еще - если кто-либо знает об этом отчете об ошибке или установил .NET 4.6 для отслеживания основной причины, не стесняйтесь редактировать.