Я получаю странное поведение, используя встроенную функцию C # List.Sort с пользовательским компаратором.
По некоторым причинам иногда вызывается метод Compare класса сравнения с нулевым объектом в качестве одного из параметров. Но если я проверю список с помощью отладчика, в коллекции не будет нулевых объектов.
Мой класс для сравнения выглядит так:
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 не являются нулевыми.
ОБНОВЛЕНИЕ: Да, я абсолютно уверен, что это параметр x , вызывающий исключение нулевой ссылки!
ОБНОВЛЕНИЕ: Вместо того, чтобы использовать метод List.Sort платформы, я попробовал пользовательский метод сортировки (например, new BubbleSort (). Sort (mylist) ), и проблема исчезла , Как я и подозревал, метод List.Sort по какой-то причине передает null в компаратор.