为什么IEquatable <t>的两个相等实例返回false?

时间:2016-03-29 16:22:44

标签: c# equality iequatable

请考虑以下代码

public class Rectangle : IEquatable<Rectangle>
{
    public int Width { get; set; }
    public int Height { get; set; }

    public bool Equals(Rectangle other)
    {
        return Width == other.Width
            && Height == other.Height;
    }
}

IEquatable<Rectangle> a = new Rectangle() { Width = 10, Height = 20 };
IEquatable<Rectangle> b = new Rectangle() { Width = 10, Height = 20 };

a.Equals(b); // returns false;

我知道这个类的语义很糟糕(对不起)。我通常遵循IEquatable<T>实现的C#指南,其中指出object.Equals(object obj)也需要被覆盖。 - 这只是猜测。

由于 a b 被声明为IEquatable<Rectangle>,为什么当我致电Equals时,它是在调用object.Equals(object obj),而是比IEquatable<Rectangle>.Equals(Rectangle other)

object实现使用IEquatable<T>实现似乎有点奇怪(同样,我知道我应该覆盖类默认Equals(object obj)实现...这是只是猜测为什么会发生这种情况)

1 个答案:

答案 0 :(得分:5)

考虑方法:

public bool Equals(Rectangle other)

但是你没有将Rectangle传递给它,你将它传递给IEquatable<Rectangle>,因此编译器不会选择该方法。相反,它选择从System.Object继承的那个进行基本参考比较的那个。

基本上你已经让矩形能够将自己与另一个矩形进行比较,然后让它将自己与可以将自身与矩形进行比较的其他东西进行比较。编译器不会胜任,并且无法推断出适用于的唯一类型是矩形。