我正在阅读以下问题及其答案---
---这基本上表示一个自然正确的和通常有效地GetHashCode
System.ValueType
的实现并不容易。其中一个链接帖子的答案简要地表明GetHashCode存在关于结构的十进制字段的错误,例如:
struct Test { public decimal value; }
static void Main() {
var d1 = 1.0m;
var d2 = 1.00m; // Numerically equal but has different bits
var t1 = new Test() { value = d1 };
var t2 = new Test() { value = d2 };
Console.WriteLine(Equals(d1, d2)); // True
Console.WriteLine(d1.GetHashCode() == d2.GetHashCode()); // True
Console.WriteLine(Equals(t1, t2)); // True
Console.WriteLine(t1.GetHashCode() == t2.GetHashCode()); // False!
}
对于这个包含小数的结构,ValueType.GetHashCode
违反了Equals
/ GetHashCode
关系。需要说明的是,以下内容(来自MSDN的摘要):
两个相等的对象返回相等的哈希码。
现在,请注意ValueType.Equals
(框架4.5)的文档:
如果当前实例和obj的所有字段都没有引用 类型,Equals方法执行两者的逐字节比较 记忆中的物体。
所以这显然不是真的,也观察到here。
我的(修订版)问题:这是Equals
中的错误还是GetHashCode
中的错误?从其他帖子的内容来看,似乎该错误出现在GetHashCode
中,但MSDN可能存在的文档缺陷使其非常不清楚。