请考虑以下代码
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)
实现...这是只是猜测为什么会发生这种情况)
答案 0 :(得分:5)
考虑方法:
public bool Equals(Rectangle other)
但是你没有将Rectangle
传递给它,你将它传递给IEquatable<Rectangle>
,因此编译器不会选择该方法。相反,它选择从System.Object
继承的那个进行基本参考比较的那个。
基本上你已经让矩形能够将自己与另一个矩形进行比较,然后让它将自己与可以将自身与矩形进行比较的其他东西进行比较。编译器不会胜任,并且无法推断出适用于的唯一类型是矩形。