一個滿逗趣的現象

以下這個關於 .Net Framework 內建實值型別實作 IComparable 介面的現象很有趣

        以下這個關於 .Net Framework 內建實值型別實作  IComparable<T> 介面的現象很有趣,在 MSDN 上有這麼一段註解 :

2015-07-03_23-59-46

 

 

        然後寫個範例來測試這些內建的實質型別呼叫 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 文件的註解還真是讓你沒話可說。