無法通過編譯,因公用 Customer.CompareTo(Customer right) 參數不匹配,而 IComparable.CompareTo(object right) 不可存取,只能強制轉換為 IComparable 介面後存取:
Customer c1; Employee e1;
if ((c1 as IComparable).CompareTo(e1) > 0) Console.WriteLine("Customer one is greater");
隱式實作 IComparable 並提供型別安全比較時,重載版本的強型別比較增加效能,減少他人誤用 CompareTo 可能。.NET 框架 Sort 函數仍用介面指標存取 CompareTo()(原則 19),但已知兩物件型別時程式碼效能較好。
對 Customer 結構小修改,C# 可重載標準關係運算子,應利用型別安全 CompareTo():
public struct Customer : IComparable
{
private string _name;
public Customer(string name) { _name = name; }
#region IComparable Members
int IComparable.CompareTo(object right)
{
if (!(right is Customer)) throw new ArgumentException("Argument not a customer", "right");
Customer rightCustomer = (Customer)right;
return CompareTo(rightCustomer);
}
public int CompareTo(Customer right) { return _name.CompareTo(right._name); }
public static bool operator <(Customer left, Customer right) { return left.CompareTo(right) < 0; }
public static bool operator <=(Customer left, Customer right) { return left.CompareTo(right) <= 0; }
public static bool operator >(Customer left, Customer right) { return left.CompareTo(right) > 0; }
public static bool operator >=(Customer left, Customer right) { return left.CompareTo(right) >= 0; }
#endregion
}