IComparable实现 - 比较运算符重载

时间:2017-05-13 23:44:24

标签: c#

我正在研究上面提到的并且发生了一些有趣的事情。要重置比较运算符<>,我必须从CompareTo接口实现IComparable方法。此方法采用object类型的一个参数,但在我正在使用的书中的示例中,它使用自定义Point类型编写了方法,如下所示:

public int CompareTo(Point other) {
    if (this.X > other.X && this.Y > other.Y)
        return 1;
    if (this.X < other.X && this.Y < other.Y)
        return -1;
    else
        return 0;
}

当我在visual studio中编写它时,编译器说没有实现IComparable接口。 认为问题是传递的参数是Point type,我传递了object type并将其转换为方法体中的Point type并且它起作用,如下所示:

public int CompareTo(object obj) {
    Point other = (Point)obj;
    if (this.X > other.X && this.Y > other.Y)
        return 1;
    if (this.X < other.X && this.Y < other.Y)
        return -1;
    else
        return 0;
}

这本书没有提到这一点。我的问题是:为了将接口视为由编译器实现,这个转换是否总是必要的?或者这是一种更“直接”的做法吗?

1 个答案:

答案 0 :(得分:2)

您有IComparable的两个版本。通用和非通用。两者都在System命名空间下。实现非通用IComparable版本时,需要在类型上提供的方法是:

int CompareTo(object obj)

对通用IComparable<T>版本的进行了注释:

int CompareTo(T obj)

因此,在非通用IComparable中,您需要投放此obj,因为它已装箱为object。为了确保您传递正确的类型,您可以尝试一个safecast,样本:

if (obj == null)
   throw new ArgumentNullException("The obj must be provided");

var anotherCustomer = obj as Customer;
if (anotherCustomer == null)
   throw new ArgumentException("The obj must be a Customer");

另一方面,当您需要特定类型时,您拥有适用于案例的通用版本。