C# 为什么两个相等的IEquatable实例<;T>;返回错误?

C# 为什么两个相等的IEquatable实例<;T>;返回错误?,c#,equality,iequatable,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 == o

考虑以下代码

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
{
公共整数宽度{get;set;}
公共整数高度{get;set;}
公共布尔等于(其他矩形)
{
返回宽度==其他.Width
&&高度==其他高度;
}
}
IEquatable a=新矩形(){Width=10,Height=20};
IEquatable b=新矩形(){Width=10,Height=20};
a、 等于(b);//返回false;
我知道这个类的值语义很糟糕(对不起)。我通常遵循C#指南的
IEquatable
实现,该指南指出
object.Equals(object obj)
也需要被覆盖。-这只是猜测

既然a和b被声明为
IEquatable
,为什么当我调用
Equals
时,它调用的是
object.Equals(object obj)
,而不是
IEquatable.Equals(矩形其他)

IEquatable
实现之上使用
object
实现似乎有点奇怪(同样,我知道我应该重写类default
Equals(object obj)
实现……这只是猜测为什么会发生这种情况)

考虑一下这个方法:

public bool Equals(Rectangle other)
但是,您没有向它传递一个
矩形
,而是向它传递了一个
IEquatable
,因此编译器不会选择该方法。相反,它选择从执行基本引用比较的
System.Object
继承的对象

基本上,您已经使矩形能够将自身与另一个矩形进行比较,然后让它将自身与其他可以将自身与矩形进行比较的对象进行比较。编译器不会也无法推断出该方法将应用于的唯一类型是矩形。

请考虑以下方法:

public bool Equals(Rectangle other)
但是,您没有向它传递一个
矩形
,而是向它传递了一个
IEquatable
,因此编译器不会选择该方法。相反,它选择从执行基本引用比较的
System.Object
继承的对象


基本上,您已经使矩形能够将自身与另一个矩形进行比较,然后让它将自身与其他可以将自身与矩形进行比较的对象进行比较。编译器将不会也无法推断出此应用的唯一类型是矩形。

因为我不明白您为什么要首先传递它
IEquatable
,我无法告诉您如何修复代码,只能说“不要那样做”.因为我不明白你为什么要首先传递它
IEquatable
,我不能告诉你如何修复代码,只能说“不要那样做”。