我使用内置的C#List.Sort函数和自定义比较器得到奇怪的行为.
出于某种原因,它有时会将comparer类的Compare方法与null对象作为参数之一进行调用.但是,如果我使用调试器检查列表,则集合中没有空对象.
我的比较器类看起来像这样:
public class DelegateToComparer<T> : IComparer<T>
{
private readonly Func<T,T,int> _comparer;
public int Compare(T x, T y)
{
return _comparer(x, y);
}
public DelegateToComparer(Func<T, T, int> comparer)
{
_comparer = comparer;
}
}
Run Code Online (Sandbox Code Playgroud)
这允许委托传递给List.Sort方法,如下所示:
mylist.Sort(new DelegateToComparer<MyClass>(
(x, y) => {
return x.SomeProp.CompareTo(y.SomeProp);
});
Run Code Online (Sandbox Code Playgroud)
因此,即使没有mylist的元素为null,上面的委托也会为x参数抛出一个空引用异常.
更新:是的我绝对相信它是参数x抛出空引用异常!
更新:我没有使用框架的List.Sort方法,而是尝试了一种自定义排序方法(即新的BubbleSort().排序(mylist)),问题就消失了.正如我所怀疑的,List.Sort方法由于某种原因将null传递给比较器.