RyuJIT – 带有ushort和Equals覆盖的错误(64位)

在将32位托管应用程序移植到64位时,我通过结构中的Equals()覆盖观察到了一种奇怪的行为。

你在github找到了一个repro。

要重现该错误,您应该使用“optimize”标志编译库。 这是Release配置的默认设置。 必须在不进行任何优化的情况下编译消耗的TestApp。 首选必须禁用32位才能启动64位应用程序。 请参阅github上的说明!

该库包含一个实现IEquatable接口的结构,该接口使用简单的代码行实现。

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

此代码调用ushort / UInt16类型的Equals方法。 如果使用建议的配置构建解决方案,则32767以上的所有值都将失败。 你在ushort值为32768时调用Equal,而’other’的值也是32768.但是对于32767以上的所有值,Equals()将返回false。

如果您更改方法以使用’==’运算符,代码将起作用。 此外,如果您将类型从struct更改为class,则代码将按预期运行。

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

我认为这是RyuJIT-Compiler中的一个错误。 如果我使用传统的JIT编译器,代码工作正常。

在不同的Windows版本上使用Visual Studio 2015和TargetFramework 4.6.2进行测试。

通过检查确认错误。

我无法想象这里会出现什么其他答案。 如果错误是不真实的,你会得到一个答案,显示你的代码错误,但你的代码没有错。