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

不同之处在于 for short,结果不会溢出。例如,short.MinValue - (short) 1仍然是负数 -int.MinValue - 1而是int.MaxValue

换句话说,具体原因是您可以使用short(没有双关语)的快捷方式逃脱,而相同的快捷方式不适用于int. 您绝对不应该要求 IComparable<T>.CompareTo实现返回 -1、0 或 1。文档非常清楚,结果仅在负数、零或正数方面才有意义。

于 2011-07-05T08:43:59.510 回答
5

好吧,无论如何你都应该只检查符号,但原因是:我猜int等会有溢出/换行的风险(当处理 2 个大数字时)会反转符号,这意味着它必须检查运算符。

我宁愿它是一致的,但这似乎不是问题。更有可能是非典型的优化,但在记录的 API 中。特别是,short在这里进行优化并不觉得它会得到大量使用(我使用 short,但没有我做的那样多int)。

于 2011-07-05T08:44:39.307 回答