为什么 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)
也需要被覆盖。 - 这只是猜测。
既然a和b声明为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
继承的那个进行基本参考比较。
基本上你已经让矩形能够将自己与另一个矩形进行比较,然后让它将自己与其他可以将自己与矩形进行比较的东西进行比较。编译器不会也不能推断这适用于 的唯一类型是 矩形。
考虑以下代码
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)
也需要被覆盖。 - 这只是猜测。
既然a和b声明为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
继承的那个进行基本参考比较。
基本上你已经让矩形能够将自己与另一个矩形进行比较,然后让它将自己与其他可以将自己与矩形进行比较的东西进行比较。编译器不会也不能推断这适用于 的唯一类型是 矩形。