为什么我在IComparer排序中得到空引用异常?

时间:2018-06-06 14:50:57

标签: vb.net sorting nullreferenceexception icomparer

我有一个自定义对象类型列表

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被传递给IComparer。一位评论者发现IComparers需要比较空值,它与Array的底层边界相比大于数组,并且静默地在其中包含Nothing来生成预期的功能。

1 个答案:

答案 0 :(得分:0)

如果您只是在寻找调试帮助,请像这样启动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