На основании комментариев в коде это последнее:
// 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
, можно просто выполнить вычитание аргументов * 1038.* или byte
, поскольку это никогда не приведет к переполнению результата int
.