7

我得到错误:Class 'QueryParameterComparer' must implement 'Function Compare(x As QueryParameter, y As QueryParameter) As Integer' for interface 'System.Collections.Generic.IComparer(Of QueryParameter)'.

在这个类定义上:

    Protected Class QueryParameterComparer
        Implements IComparer(Of QueryParameter)

        Public Function Compare(x As QueryParameter, y As QueryParameter) As Integer
            If x.Name = y.Name Then
                Return String.Compare(x.Value, y.Value)
            Else
                Return String.Compare(x.Name, y.Name)
            End If
        End Function

    End Class

我也试着把它完整地写出来:

    Protected Class QueryParameterComparer
        Implements System.Collections.Generic.IComparer(Of QueryParameter)

        Public Function Compare(x As QueryParameter, y As QueryParameter) As Integer
            If x.Name = y.Name Then
                Return String.Compare(x.Value, y.Value)
            Else
                Return String.Compare(x.Name, y.Name)
            End If
        End Function

    End Class

我错过了什么?

4

2 回答 2

11

与在 c# 中方法的名称必须与接口中的名称匹配的情况不同,在 VB.NET 中,所有接口实现必须始终Implements在每个成员上使用关键字显式声明:

Protected Class QueryParameterComparer
    Implements IComparer(Of QueryParameter)

    Public Function Compare(x As QueryParameter, y As QueryParameter) As Integer Implements IComparer(Of QueryParameter).Compare
        ' ...
    End Function
End Class
于 2015-05-19T14:56:11.987 回答
3

VB.Net 要求您指定哪些方法是您的接口的实现方法。

Public Function Compare(x As QueryParameter, y As QueryParameter) As Integer Implements System.Collections.Generic.IComparer(Of QueryParameter).Compare

这很奇怪,但它确实允许您为实现指定不同的函数名称。这使得直接访问您的类可以为函数使用一个名称,但通过接口的引用将具有接口方法名称。您可以做的其他事情是将方法指定为 Private,以便您只能通过接口引用访问该方法。

于 2015-05-19T14:57:56.010 回答