2016-12-18 2 views
1

При портировании 32-битного управляемого приложения на 64-битное я наблюдал странное поведение переопределения Equals() внутри структуры.RyuJIT - ошибка с сокращением ushort и equals (64 бит)

Вы найдете репрограммирование в github.

Чтобы воспроизвести ошибку, вы должны скомпилировать библиотеку с флагом «optimize». Это значение по умолчанию находится в конфигурационном файле Release. Потребляемый TestApp должен быть скомпилирован без какой-либо оптимизации. Предпочтение 32 бит должен быть отключен для запуска в виде 64-битного приложения. Смотрите заметки о github!

Библиотека содержит структуру, которая реализует интерфейс IEquatable, который реализован с помощью простой строки кода.

public bool Equals(StructWithValue other) 
    { 
     return value.Equals(other.value); 
    } 

Этот код вызывает метод Equals типа ushort/UInt16. Если вы построите решение с предлагаемой конфигурацией, все значения выше 32767 потерпят неудачу. Вы вызываете Equal на значение usrort 32768, а значение «other» равно 32768. Но Equals() вернет false для всех значений выше 32767.

Если вы изменили метод использования оператора '==' код будет работать. Также, если вы измените тип от struct к классу, код будет работать как ожидалось.

public bool Equals(StructWithValue other) 
    { 
     return value == othervalue; 
    } 

Я думаю, что это ошибка в компиляторе RyuJIT. Если я использую устаревший JIT-компилятор, код работает нормально.

Протестировано с Visual Studio 2015 и TargetFramework 4.6.2 в разных версиях Windows.

+0

Кстати, ваша реализация объекта. Эвкалы очень интересны. Если бы это был ссылочный тип, я бы сообщил, что он прослушивается. – Joshua

+1

Ваши инструкции по воспроизведению немного ошибочны и заставили меня ошибиться, просто рекомендую использовать сборку Debug. Его поведение очень похоже на [эта ошибка] (http://stackoverflow.com/a/36593473/17034), а также проблема с кодогенезом, а также связанная с расширением знака, а также исчезает, когда оптимизатор включен. Обязательно укажите его отдельно. –

+0

Интересно и все, но это, похоже, не вопрос. Если это неявно «я прав». –

ответ

1

Ошибка подтверждена осмотром.

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

Смежные вопросы