在将 32 位托管应用程序移植到 64 位时,我观察到结构中的 Equals() 覆盖的奇怪行为。
你可以在github找到一个 repro 。
要重现该错误,您应该编译带有“优化”标志的库。这是发布配置的默认设置。使用的 TestApp 必须在没有任何优化的情况下编译。必须禁用首选 32 位才能以 64 位应用程序启动。见 github 上的注释!
该库包含一个实现 IEquatable 接口的结构,该接口通过简单的代码行实现。
public bool Equals(StructWithValue other)
{
return value.Equals(other.value);
}
此代码调用 ushort/UInt16 类型的 Equals 方法。如果您使用建议的配置构建解决方案,则所有高于 32767 的值都将失败。您在 32768 的 ushort 值上调用 Equal 并且“其他”的值也是 32768。但是 Equals() 将为高于 32767 的所有值返回 false。
如果您将方法更改为使用“==”运算符,则代码将起作用。此外,如果您将类型从 struct 更改为 class,代码将按预期运行。
public bool Equals(StructWithValue other)
{
return value == othervalue;
}
我认为这是 RyuJIT 编译器中的一个错误。如果我使用旧版 JIT 编译器,则代码可以正常工作。
在不同的 Windows 版本上使用 Visual Studio 2015 和 TargetFramework 4.6.2 进行了测试。