具有十进制字段的struct的Equals / GetHashCode合同违例

时间:2014-05-16 15:47:56

标签: c#

我正在阅读以下问题及其答案---

---这基本上表示一个自然正确的通常有效地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可能存在的文档缺陷使其非常不清楚。

0 个答案:

没有答案