Я получаю странное поведение, используя встроенную функцию С# List.Sort с пользовательским сопоставлением.
По какой-то причине он иногда вызывает метод сравнения класса сравнения с нулевым объектом в качестве одного из параметров. Но если я проверю список с отладчиком, в коллекции нет нулевых объектов.
Мой класс сравнения выглядит следующим образом:
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;
}
}
Это позволяет передать делегат методу List.Sort, например:
mylist.Sort(new DelegateToComparer<MyClass>(
(x, y) => {
return x.SomeProp.CompareTo(y.SomeProp);
});
Таким образом, вышеупомянутый делегат будет генерировать исключение нулевой ссылки для параметра x, даже если никакие элементы mylist не равны.
UPDATE: Да, я абсолютно уверен, что это параметр x, который бросает исключение нулевой ссылки!
UPDATE: Вместо использования метода Framework List.Sort я попробовал собственный метод сортировки (т.е. новый BubbleSort(). Sort (mylist)), и проблема исчезла. Как я и подозревал, метод List.Sort по какой-то причине передает значение null.