请考虑以下代码:
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;
}
答案 0 :(得分:13)
不同之处在于short
,结果不会溢出。例如,short.MinValue - (short) 1
仍为负数,而int.MinValue - 1
为int.MaxValue
。
换句话说,具体原因是您可以使用short
(没有双关语)的快捷方式,而相同的快捷方式不适用于int
。你绝对不应该要求 IComparable<T>.CompareTo
实现返回-1,0或1.文档非常清楚,结果只有在负,零或正面方面才有意义。< / p>
答案 1 :(得分:5)
好吧,你应该只检查的标志,但原因是:我想int
等会有溢出/换行的风险(当处理2个大幅度时)数字)会反转符号,这意味着必须检查运算符。
我宁愿它是一致的,但它似乎不是一个问题。更可能是非典型但在记录的API内的优化。特别是,在这里优化short
并不意味着它将获得大量使用量(我使用 short
,但不是任何喜欢和int
}一样。