为什么 IEquatable<T> return 的两个相等实例为假?

Why do two equal instances of IEquatable<T> return false?

考虑以下代码

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;

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

既然ab声明为IEquatable<Rectangle>,为什么我调用Equals的时候,是不是调用 object.Equals(object obj),而不是 IEquatable<Rectangle>.Equals(Rectangle other)?

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

考虑方法:

public bool Equals(Rectangle other)

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

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