2009-06-17 20 views
3

我想实现一个简单的IEqulityComparer与LINQ集合使用。我写了下面的代码减少到最简单的讨论目的形式...自定义Generic.IEqualityComparer(的T) - 编译器错误

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’(或‘等于’)问题在基类“Object”中隐藏一个可覆盖的方法。要覆盖基类方法,必须声明此方法为'Overrides'。但是,如果我将它们声明为Overrides,则会出现错误“function'GetHashCode'不能被声明为Overrides,因为它不会覆盖基类中的函数。”

我也遇到了“实现”行上的编译器错误,必须实现“getHashCode”,但我认为这是第一个问题的结果。

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

回答

1

好吧,它似乎通过重命名函数并将它们声明为“实现”来排序,尽管我已经看到了几十个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 
1

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

VB.NET要求你明确地实现说什么方法正在实现。你可以使用相同的名字(这是鼓励),你只需要有'实施'条款。

1

我得到同样的问题。我将我的C#代码转换为VB.Net;即使添加工具也没有帮助; 使用阴影或超载删除所有警告和错误。我想知道在这两种情况下行为有什么不同。 如果我指定覆盖,我得到一个错误。 未指定任何(覆盖,重载,阴影)会发出警告。

' <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 
3

这是一个较晚的问题的答案,但根据您可以使用以下文件。注意包含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