Алгоритм сортировки (QuickSort) основан на предсказуемой реализации IComparer. После нескольких десятков слоев косвенного обращения в BCL вы в конечном итоге выберете следующий метод:
public void Sort(T[] keys, int index, int length, IComparer<T> comparer)
{
try
{
...
ArraySortHelper<T>.QuickSort(keys, index, index + (length - 1), comparer);
}
catch (IndexOutOfRangeException)
{
...
throw new ArgumentException(Environment.GetResourceString("Arg_BogusIComparer", values));
}
}
Пройдя немного дальше в реализации QuickSort, вы увидите код, подобный следующему:
while (comparer.Compare(keys[a], y) < 0)
{
a++;
}
while (comparer.Compare(y, keys[b]) < 0)
{
b--;
}
В основном, если IComparer неправильно ведет себя вызов Quicksort с броском IndexOutOfRangeException, который обернут в n ArgumentException.
Вот еще один пример плохого IComparer
class Comparer: IComparer<int>
{
public int Compare(int x, int y)
{
return -1;
}
}
Так что, я думаю, краткий ответ таков, что каждый раз, когда ваша реализация IComparer последовательно не сравнивает значения, определенные в документации:
Сравнивает два объекта и возвращает
значение, указывающее, меньше ли
чем, равно или больше, чем
другой.