C#Comparer.Default <short> .Compare and Comparer.Default <byte>不返回-1、0或1

时间:2018-10-05 18:25:31

标签: c# byte short icomparer

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

这是否是一种优化功能(返回差异更快)和/或因为两个短裤或两个字节之间的可能差异将适合int(返回类型Comparer<T>.Compare)?但是两个ints之间的区别不会(例如Comparer<T>.Compare(int.MinValue, int.MaxValue)

2 个答案:

答案 0 :(得分:2)

基于comments in the code是后者:

// Need to use compare because subtraction will wrap
// to positive for very large neg numbers, etc.

例如,假设我们具有与short的{​​{1}}或byte相同的实现:

int

现在,private int Compare(int x, int y) { return x - y; } 合同规定如果IComparer的结果为:

  • 小于零,然后x
  • 大于零,然后x> y;
  • 0,然后x == y;

但是,在上述实现中,如果我们传递足够大的负整数作为第一个参数,则减法将溢出并包装为一个非常大的正数:

Compare

该结果将错误地指示Compare(Int32.MinValue, 1); // returns 2147483647 大于Int32.MinValue

鉴于1被定义为:

IComparer

也就是说,结果类型为public int Compare (T x, T y); ,只对参数intshort进行减法是安全的,因为它永远不会导致byte结果溢出。

答案 1 :(得分:0)

我认为您完全正确。整数差异不适合整数,但字节差异总是适用。

指定返回值Compare仅与符号有关。因此,对于较小的类型返回xy之差是一种有效且有用的性能优化。

如果您有兴趣:其他语言完全不必遵循符号模型(< 00> 0)。某些代码(例如Haskell)返回具有三个可能值Less, Equal, Greater的枚举。这更干净但是更慢。