Sort的文档称,如果“比较器的实现在排序过程中引发错误。例如,当比较器将一个项与自身进行比较时,可能不会返回0”,则Sort会抛出ArgumentException异常。
除了给出的示例外,还有谁能告诉我这种情况什么时候会发生?
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));
}
}
进一步深入了解快速排序的实现,你会看到像这样的代码:
while (comparer.Compare(keys[a], y) < 0)
{
a++;
}
while (comparer.Compare(y, keys[b]) < 0)
{
b--;
}
基本上,如果IComparer行为不当,则Quicksort调用会抛出IndexOutOfRangeException异常,该异常被包装在ArgumentException中。
这是另一个错误的IComparer示例
class Comparer: IComparer<int>
{
public int Compare(int x, int y)
{
return -1;
}
}
我想,简短的答案是:当你的IComparer实现与文档中定义的一样不能一致地比较值时:
比较两个对象,并返回一个值表示其中一个对象是否小于、等于或大于另一个对象。