我正在研究上面提到的并且发生了一些有趣的事情。要重置比较运算符<
和>
,我必须从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;
}
这本书没有提到这一点。我的问题是:为了将接口视为由编译器实现,这个转换是否总是必要的?或者这是一种更“直接”的做法吗?
答案 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");
另一方面,当您需要特定类型时,您拥有适用于案例的通用版本。