1

在将 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 进行了测试。

4

1 回答 1

1

Bug confirmed by inspection.

I can't imagine what other answer could appear here. If the bug were unreal you would get an answer showing you where your code is wrong, but your code is not wrong.

于 2016-12-18T21:21:00.420 回答