基于GetHashCode的Equals是否有任何负面后果?

Shi*_*mmy 1 .net c# equals gethashcode

以下代码可以吗?

public override bool Equals(object obj)
{
  if (obj == null || !(obj is LicenseType))
    return false;
  return GetHashCode() == obj.GetHashCode();
}

public override int GetHashCode()
{
  return
    Vendor.GetHashCode() ^ 
    Version.GetHashCode() ^ 
    Modifiers.GetHashCode() ^ 
    Locale.GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)

所有属性都是枚举/数字字段,并且是唯一定义LicenseType对象的属性.

Cei*_*isc 6

当两个不同的对象返回相同的HashCodes时会发生什么?

毕竟,它只是一个哈希值,因此在对象可以拥有的整个值范围内可能并不明显.


Pat*_*man 6

不,文档非常清楚地说明:

您不应该假设相等的哈希码意味着对象相等.

也:

两个相等的对象返回相等的哈希码.但是,反之则不然:相等的哈希码并不意味着对象相等

和:

警告:

  • 不要测试哈希码的相等性以确定两个对象是否相等.(不等的对象可以具有相同的哈希码.)要测试相等性,请调用ReferenceEqualsEquals方法.