【问题标题】:Custom Generic.IEqualityComparer(Of T) - Compiler Errors自定义 Generic.IEqualityComparer(Of T) - 编译器错误
【发布时间】:2009-06-17 11:15:52
【问题描述】:

我正在尝试实现一个简单的 IEqulityComparer 以与 LINQ 集合一起使用。为了讨论的目的,我编写了以下代码,将其简化为最简单的形式...

Public Structure bob
    Dim SiteID As Integer
    Dim fred As String
End Structure

Public Class insCompare
    Implements System.Collections.Generic.IEqualityComparer(Of bob)

    Public Function Equals(ByVal x As bob, ByVal y As bob) As Boolean
        Return IIf(x.SiteID = y.SiteID, True, False)

    End Function

    Public Function GetHashCode(ByVal x As bob) As Integer
        Return x.SiteID.GetHashCode()

    End Function

End Class

我遇到的问题是这两个函数都会抛出编译器警告“函数'getHashCode'(或'Equals')在基类'Object'中隐藏了一个可覆盖的方法。要覆盖基类方法,这个方法必须是声明为“覆盖”。”

但是,如果我将它们声明为 Overrides,我会收到错误“函数 'GetHashCode' 不能被声明为 Overrides,因为它没有覆盖基类中的函数。”!!

我还在“Implements”行收到编译器错误,大意是我必须实现“getHashCode”,但我认为这是第一个问题的结果。

我所有的研究都表明我应该没事 - 请问有人有任何线索吗?

【问题讨论】:

    标签: vb.net linq compiler-warnings iequalitycomparer


    【解决方案1】:

    这是对该问题的较晚答案,但根据文档,您可以使用以下内容。请注意包含 Overloads 关键字。

    Public Class MyModelComparer
        Implements Generic.IEqualityComparer(Of MyModel)
    
        Public Overloads Function Equals(x As MyModel, y As MyModel) As Boolean Implements System.Collections.Generic.IEqualityComparer(Of MyModel).Equals
           ' do compare
        End Function
    
        Public Overloads Function GetHashCode(obj As MyModel) As Integer Implements System.Collections.Generic.IEqualityComparer(Of MyModel).GetHashCode
           ' do hashcode
        End Function
    
    End Class
    

    【讨论】:

      【解决方案2】:

      好的,似乎可以通过重命名函数并将它们声明为“Implements”来进行排序,尽管我在 Web 上看到了许多示例,但情况并非如此。 但是我现在得到一个运行时异常,我将单独发布。

      Public Class insCompare
          Implements System.Collections.Generic.IEqualityComparer(Of Object)
      
          Public Function Equals1(ByVal x As Object, ByVal y As Object) As Boolean Implements System.Collections.Generic.IEqualityComparer(Of Object).Equals
              Return IIf(x.SiteID = y.SiteID, True, False)
      
          End Function
      
          Public Function GetHashCode1(ByVal x As Object) As Integer Implements System.Collections.Generic.IEqualityComparer(Of Object).GetHashCode
              Return x.SiteID.ToString.ToLower.GetHashCode()
      
          End Function
      
      End Class
      

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题。我正在将我的 C# 代码转换为 VB.Net;即使添加工具也无济于事; 使用影子或重载可以消除所有警告和错误。我想知道这两种情况下的行为有什么不同。 如果我指定 Overrides,我会收到错误消息。 不指定任何(覆盖、重载、阴影)都会发出警告。

        ' <summary>
        ' Pair Comparator for maintaining uniquness in results.
        ' </summary>
        Public Class PairComparer
            Implements IEqualityComparer(Of Pair)
            Public Shadows Function Equals(ByVal x As Pair, ByVal y As Pair) As Boolean Implements System.Collections.Generic.IEqualityComparer(Of Pair).Equals
        
                If x.first = y.first AndAlso x.second = y.second Then
                    Equals = True
                ElseIf x.first = y.second AndAlso x.second = y.first Then
                    Equals = True
                Else
                    Equals = False
                End If
            End Function
        
            Public Overloads Function GetHashCode(ByVal obj As Pair) As Integer Implements System.Collections.Generic.IEqualityComparer(Of Pair).GetHashCode
                GetHashCode = obj.first + obj.second
            End Function
        End Class
        

        【讨论】:

          【解决方案4】:

          您收到编译器错误是因为您使用的是 VB.NET,而不是 C#。在 C# 中,拥有与您需要实现的接口方法具有相同签名的方法会使编译器自动为您连接。

          VB.NET 要求您明确实施说明正在实施的方法。您可以使用相同的名称(鼓励使用),您只需要有那个 'implements' 子句。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-13
            • 2023-03-31
            • 1970-01-01
            • 1970-01-01
            • 2011-01-18
            • 1970-01-01
            相关资源
            最近更新 更多