При портировании 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.
Кстати, ваша реализация объекта. Эвкалы очень интересны. Если бы это был ссылочный тип, я бы сообщил, что он прослушивается. – Joshua
Ваши инструкции по воспроизведению немного ошибочны и заставили меня ошибиться, просто рекомендую использовать сборку Debug. Его поведение очень похоже на [эта ошибка] (http://stackoverflow.com/a/36593473/17034), а также проблема с кодогенезом, а также связанная с расширением знака, а также исчезает, когда оптимизатор включен. Обязательно укажите его отдельно. –
Интересно и все, но это, похоже, не вопрос. Если это неявно «я прав». –