3

从 Microsoft 的文档来看,这两种 Equals 方法本质上是相同的。但是我偶然发现了一些非常奇怪的东西。在我的 Silverlight 项目中,我有两个覆盖 Equals 的相同类的实例。如果我要求inst1.Equals(inst2)inst2.Equals(inst1)我总是得到真实的结果。但是Object.Equals(inst1, inst2)返回false。这怎么可能?

有任何想法吗?

谢谢,洛克

4

4 回答 4

6

obj1.Equals假设 obj1 不是null. object.Equals甚至适用于null价值观。但是,这并不能解释您看到的行为;我认为您应该提供一些代码来重现它以获得更好的答案。

于 2010-09-13T15:15:18.227 回答
3

obj1.Equals 可以被覆盖,Object.Equals 不能。换句话说,Object.Equals 是 Equals 方法的基本实现,如果您不覆盖它,您可以免费获得它。由于您确实覆盖了它,因此这两种实现是不同的,并且可能会产生不同的结果。

于 2010-09-13T15:13:36.170 回答
1

我认为 Object.Equals 将测试 2 个参数是否是相同的引用,即它们指向相同的内存空间。

MyClass.Equals 可能有不同的实现,这样两个引用不同的类实际上可能相等(基于它们的字段和属性)。

于 2010-09-13T15:13:57.823 回答
0

注意正确执行IEquatable<T>。我犯了以下错误:

public class SubjectDTO: IEquatable<SubjectDTO>
{
    public string Id;

    public bool Equals(SubjectDTO other)
    {
        return Object.Equals(Id, other.Id);
    }

    public override int GetHashCode()
    {
        return Id == null ? 1 : Id.GetHashCode();
    }
}

看起来不错,对吧?但是当你尝试它时,你会发现令人惊讶的结果:

var a = new SubjectDTO() { Id = "1"};
var b = new SubjectDTO() { Id = "1"};
Console.WriteLine(Object.Equals(a, b));
Console.WriteLine(a.Equals(b));

False
True

嗯?好吧,重要的是要覆盖Equals(object other)

public override bool Equals(object other)
{
    return other == null ? false : Equals(other as SubjectDTO);
}

当您将它添加到SubjectDTO类中时,它将按预期工作。

于 2011-03-07T19:39:27.623 回答