Почему я получаю исключение нулевой ссылки на сортировку IComparer? - PullRequest
0 голосов
/ 06 июня 2018

У меня есть список пользовательских типов объектов, скажем

Dim a As New List(Of CustomType)

, заполненный экземплярами.У меня есть класс сравнения, который наследует

Public Class CustomTypeComparer
    Implements IComparer(Of CustomType)
    Public Function Compare(x As CustomType, y As CustomType) As Integer Implements IComparer(Of CustomType).Compare
        ...
    End Function
End Class

, который вызывается с использованием метода

a.Sort(New CustomTypeComparer)

.Единственный метод компаратора Compare() вызывается автоматически, однако иногда этот метод завершается ошибкой, поскольку x не определен или «Не задан для экземпляра объекта».

Я просмотрел отсортированный список, чтобы не проверить егоиз элементов Nothing, подтверждается часами на a.Contains(Nothing), которые возвращают False и проверяется с помощью других компараторов, которые смотрят на другие части объекта, ни у одного из них нет проблем со списком, только у этого.

Как я могу изучить проблему глубже?Есть ли какие-либо идеи, которые люди могут дать по этому вопросу?

Обновление:

При чтении справочного исходного кода платформы, метод сортировки списка использует базовый Array.Sort()метод.Получив подсказку, и я попытался использовать метод List.TrimExcess() в списке, это изменило поведение, и Nothing s не было передано IComparer.Комментатор обнаружил, что ожидается, что IComparers будет сравнивать нулевые значения, что в сочетании с тем, что базовая граница массива больше, чем массив, и имеет молча Nothing s для создания ожидаемой функциональности.

1 Ответ

0 голосов
/ 06 июня 2018

Если вам нужна помощь в отладке, запустите CustomTypeComparer следующим образом

Public Class CustomTypeComparer
    Implements IComparer(Of CustomType)
    Public Function Compare(x As CustomType, y As CustomType) As Integer Implements IComparer(Of CustomType).Compare
        If x Is Nothing Then
            Stop
        ElseIf y Is Nothing Then
            Stop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...