所有“数字”比较器(例如Comparer.Default<int>Comparer.Default<long>等)背后返回-101的原因是什么,但是Comparer.Default<short>Comparer.Default<byte>将返回两者之间的差两个比较的数字?

它是一种优化功能(返回差异更快)和/或因为两个短裤或两个字节之间的可能差异将适合intComparer<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具有与byteint相同的实现:

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,只对参数shortbyte进行减法是安全的,因为它永远不会导致int结果溢出。

关于c# - C#Comparer.Default <short> .Compare and Comparer.Default <byte>不返回-1、0或1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52671354/

10-12 06:42