我有一个与以下相似的课程:
class Abc
{
public string A {get;set;}
public string B {get;set;}
}
等于的标准是A或B中的任何一个是否匹配两个Abc类的对象应匹配。
public override bool Equals (Abc obj)
{
if (obj.A == A || obj.B == B)
return true;
else return false;
}
任何人都可以让我知道在这种情况下什么样的GetHashCode函数将提供相等的值。
因为A和B字段的值可能相同,也可能不同。
答案 0 :(得分:5)
实现GetHashCode
的唯一且唯一的要求是,当两个对象被认为相等时(即Equals
返回true),则它们的哈希码必须匹配。
在您的情况下,如果您有两个不同的对象,它们的x =(A1,B1)和y =(A2,B2),则它们的哈希码必须相同,因为它必须与z =(A1, B2),因为x和z相等,因此y和z也相等。因此,GetHashCode
的唯一有效实现是始终返回一个常数,例如0。
您可能会奇怪,因为仅返回一个常数的GetHashCode
实现是没有意义的,这是事实。原因是您的Equals
也没有意义。您最大的问题是Equals
不可传递。 x和z相等,z和y相等,但x和y不相等。这与您的预期相反。