[英]C# GetHashCode/Equals override not called
我遇到了GetHashCode和Equals的问题,我已经覆盖了一个类。 我使用operator ==来验证两者是否相等,并且如果它们的哈希码相同以便验证它们确实相等,我希望它将调用GetHashCode和Equals。
但令我惊讶的是,没有被调用,并且相等测试的结果是错误的(虽然它实际上应该是真的)。
覆盖代码:
public class User : ActiveRecordBase<User>
[...]
public override int GetHashCode()
{
return Id;
}
public override bool Equals(object obj)
{
User user = (User)obj;
if (user == null)
{
return false;
}
return user.Id == Id;
}
}
平等检查:
if (x == y) // x and y are both of the same User class
// I'd expect this test to call both GetHashCode and Equals
运算符==
与.GetHashCode()
或.Equals()
完全分开。
您可能对Microsoft 重载等于()和运算符==的指南感兴趣。
简短版本是:使用.Equals()
来实现相等比较。 使用operator ==
进行身份比较,或者如果要创建不可变类型(其中每个相等的实例可以被认为实际上相同)。 此外, .Equals()
是一个虚方法,可以被子类覆盖,但operator ==
取决于使用它的表达式的编译时类型。
最后,为了保持一致, .GetHashCode()
实现.GetHashCode()
都要实现.Equals()
。 重载运算符!=
任何时候重载运算符==
。
也许在你的User
类中再添加一个方法。
public virtual bool Equals(User other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return other.Id == Id;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.