所有“数字”比较器(例如Comparer.Default<int>
,Comparer.Default<long>
等)背后返回-1
,0
或1
的原因是什么,但是Comparer.Default<short>
和Comparer.Default<byte>
将返回两者之间的差两个比较的数字?
它是一种优化功能(返回差异更快)和/或因为两个短裤或两个字节之间的可能差异将适合int
(Comparer<T>.Compare
返回类型)吗?但是两个ints
之间的差异不会(例如Comparer<T>.Compare(int.MinValue, int.MaxValue)
)
最佳答案
基于comments in the code是后者:
// Need to use compare because subtraction will wrap
// to positive for very large neg numbers, etc.
例如,假设我们对
short
具有与byte
或int
相同的实现:private int Compare(int x, int y)
{
return x - y;
}
现在,
IComparer
合同规定,如果Compare
的结果为:小于零,则x 大于零,则x> y;
零,则x == y;
但是,在上述实现中,如果我们传递足够大的负整数作为第一个参数,则减法将溢出并包装为一个非常大的正数:
Compare(Int32.MinValue, 1); // returns 2147483647
那就是结果将错误地指示
Int32.MinValue
大于1
。鉴于
IComparer
被定义为:public int Compare (T x, T y);
也就是说,结果类型是
int
,只对参数short
或byte
进行减法是安全的,因为它永远不会导致int
结果溢出。关于c# - C#Comparer.Default <short> .Compare and Comparer.Default <byte>不返回-1、0或1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52671354/