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
实现似乎有点奇怪(同样,我知道我应该重写类defaultEquals(object obj)
实现……这只是猜测为什么会发生这种情况)考虑一下这个方法:
public bool Equals(Rectangle other)
但是,您没有向它传递一个矩形
,而是向它传递了一个IEquatable
,因此编译器不会选择该方法。相反,它选择从执行基本引用比较的System.Object
继承的对象
基本上,您已经使矩形能够将自身与另一个矩形进行比较,然后让它将自身与其他可以将自身与矩形进行比较的对象进行比较。编译器不会也无法推断出该方法将应用于的唯一类型是矩形。请考虑以下方法:
public bool Equals(Rectangle other)
但是,您没有向它传递一个矩形
,而是向它传递了一个IEquatable
,因此编译器不会选择该方法。相反,它选择从执行基本引用比较的System.Object
继承的对象
基本上,您已经使矩形能够将自身与另一个矩形进行比较,然后让它将自身与其他可以将自身与矩形进行比较的对象进行比较。编译器将不会也无法推断出此应用的唯一类型是矩形。因为我不明白您为什么要首先传递它
IEquatable
,我无法告诉您如何修复代码,只能说“不要那样做”.因为我不明白你为什么要首先传递它IEquatable
,我不能告诉你如何修复代码,只能说“不要那样做”。