在将32位托管应用程序移植到64位时,我在struct中观察到了相等()覆盖的奇怪行为。
你可以在github找到一个复制品。
为了重现错误,您应该编译带有“优化”标志的库。这是发行版配置的默认设置。必须在不进行任何优化的情况下编译消费TestApp。首选32位必须禁用作为64位应用程序启动。参见关于github!的说明
库包含一个实现IEquatable接口的结构,该接口是用简单的代码行实现的。
public bool Equals(StructWithValue other)
{
return value.Equals(other.value);
}此代码调用ushort/UInt16 16类型的相等方法。如果使用建议的配置构建解决方案,则32767以上的所有值都将失败。如果ushort值为32768,则调用Equal,“other”的值也为32768。但等于()将对32767以上的所有值返回false。
如果您将方法更改为使用“==”运算符,则代码将工作。此外,如果将类型从struct更改为class,代码将按预期运行。
public bool Equals(StructWithValue other)
{
return value == othervalue;
}我认为这是中的一个bug。如果我使用遗留的,代码可以正常工作。
在不同的windows版本上使用Visual 2015和TargetFramework 4.6.2进行测试。
发布于 2016-12-18 21:21:00
通过检查确认了窃听器。
我无法想象还有什么答案会出现在这里。如果错误是不真实的,你会得到一个答案,告诉你你的代码哪里错了,但你的代码没有错。
https://stackoverflow.com/questions/41212637
复制相似问题