以下這個關於 .Net Framework 內建實值型別實作 IComparable
以下這個關於 .Net Framework 內建實值型別實作 IComparable<T> 介面的現象很有趣,在 MSDN 上有這麼一段註解 :
然後寫個範例來測試這些內建的實質型別呼叫 IComparable<T>.CompareTo 的行為:
static void Main(string[] args)
{
System.Byte z1 = 9;
System.Byte z2 = 2;
Console.WriteLine(z1.CompareTo(z2));
System.Int16 m1 = 9;
System.Int16 m2 = 2;
Console.WriteLine(m1.CompareTo(m2));
System.UInt16 n1 = 9;
System.UInt16 n2 = 2;
Console.WriteLine(n1.CompareTo(n2));
System.Int32 x1 = 9;
System.Int32 x2 = 2;
Console.WriteLine(x1.CompareTo(x2));
System.UInt32 y1 = 9;
System.UInt32 y2 = 2;
Console.WriteLine(y1.CompareTo(y2));
System.Int64 p1 = 9;
System.Int64 p2 = 2;
Console.WriteLine(p1.CompareTo(p2));
System.UInt64 q1 = 9;
System.UInt64 q2 = 2;
Console.WriteLine(q1.CompareTo(q2));
System.Single i1 = 9;
System.Single i2 = 2;
Console.WriteLine(i1.CompareTo(i2));
System.Double j1 = 9;
System.Double j2 = 2;
Console.WriteLine(j1.CompareTo(j2));
System.Decimal d1 = 9;
System.Decimal d2 = 2;
Console.WriteLine(d1.CompareTo(d2));
Console.ReadLine();
}
這個結果超逗趣的,在型別為 Byte, Int16 與 UInt16 時,結果是兩值相減,以上面的範例看起來就是 7 ( 內部實作的確是兩值相減);而其他的型別答案則是 1 (這些型別的實作就是大於時回傳 1,相等回傳 0,小於則回傳 -1)。
這告訴我們在用 IComparable<T>.CompareTo 的時候,只要判斷大於零、等於零與小於零,千萬不要判斷甚麼等於 1 或 -1 之類的。 David 老師 也提供了一個頗逗趣的程式碼,如下:
static void Main(string[] args)
{
Int32 x1 = 3, x2 = 1;
Console.WriteLine((x1.CompareTo(x2) == ((UInt32)x1).CompareTo((UInt32)x2)).ToString());
Console.WriteLine((x1.CompareTo(x2) == ((UInt16)x1).CompareTo((UInt16)x2)).ToString());
Int32 y1 = 2, y2 = 1;
Console.WriteLine((y1.CompareTo(y2) == ((UInt32)y1).CompareTo((UInt32)y2)).ToString());
Console.WriteLine((y1.CompareTo(y2) == ((UInt16)y1).CompareTo((UInt16)y2)).ToString());
Console.ReadLine();
}
答案是 True、False、True、True。說實話,這個題目拿出來考還真的滿整人的,然後 MSDN 文件的註解還真是讓你沒話可說。