繁体   English   中英

C#GetHashCode / Equals覆盖未调用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM