5

次のコードを検討してください。

namespace ConsoleApplication1 {
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(100.CompareTo(200)); // prints -1
            Console.WriteLine(((decimal)100).CompareTo((decimal)200)); // prints -1
            Console.WriteLine(((short)100).CompareTo((short)200)); // prints -100
            Console.WriteLine(((float)100).CompareTo((float)200)); // prints -1
            Console.ReadKey();
        }
    } 
}

私の質問は、Int16 の CompareTo メソッドが -1、0、1 以外の値を返す特定の理由はありますか?

ILSpy は、この方法で実装されていることを示しています

public int CompareTo(short value)
{
    return (int)(this - value);
}

一方、メソッドはこのように Int32 に実装されています

public int CompareTo(int value)
{
    if (this < value)
    {
        return -1;
    }
    if (this > value)
    {
        return 1;
    }
    return 0;
}
4

2 に答える 2

13

違いは、 の場合short、結果がオーバーフローする可能性がないことです。たとえば、short.MinValue - (short) 1はまだ負ですが、int.MinValue - 1は ですint.MaxValue

言い換えれば、特定の理由はshort、同じショートカットが では機能しないのに対し、(しゃれは意図されていません)でショートカットを回避できるためですint。実装が -1、0、または 1 を返すことを絶対に要求しないでください。ドキュメントは、結果が負、ゼロ、または正であるという点でのみ意味があることを明確に示しています。 IComparable<T>.CompareTo

于 2011-07-05T08:43:59.510 に答える
5

とにかく、実際には符号のみをチェックする必要がありますが、理由としてintは、符号が逆になるオーバーフロー/ラップ (2 つの大きな数値を処理する場合) のリスクがあると思います。つまり、演算子をチェックする必要があります。

一貫性があるといいのですが、問題はないようです。文書化された API の範囲内ではあるが、典型的ではない最適化である可能性が高いです。特に、ここでの最適化は、大量に使用されるようshortには感じられません(私は を使用しますが、私が使用するほどのものではありません)。 shortint

于 2011-07-05T08:44:39.307 に答える