我正在尝试实现一个简单的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
我遇到的问题是两个函数抛出编译器警告“function'getHashCode'(或'Equals')会在基类'Object'中隐藏一个可覆盖的方法。要覆盖基类方法,此方法必须是声明'覆盖'。“
但是,如果我将它们声明为Overrides,我会收到错误“function'GetHashCode'无法声明为Overrides,因为它不会覆盖基类中的函数。”!!
我也在“Implements”行上遇到编译错误,我必须实现“getHashCode”,但我认为这是第一个问题的结果。
我所有的研究都表明我应该没问题 - 有人得到任何线索吗?
答案 0 :(得分:4)
这是问题的最新答案,但根据文档,您可以使用以下内容。请注意包含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
答案 1 :(得分:1)
好吧,似乎通过重命名函数并将它们声明为“Implements”进行排序,尽管我在网上看到过几十个不是这种情况的例子。 但是我现在得到一个运行时异常,我将单独发布。
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
答案 2 :(得分:1)
您收到编译错误,因为您使用的是VB.NET,而不是C#。在C#中,如果方法与您需要实现的接口方法具有相同的签名,则编译器会自动为您进行连接。
VB.NET要求您明确实现说明正在实现的方法。您可以使用相同的名称(鼓励它),您只需拥有'implements'子句。
答案 3 :(得分:1)
我遇到了同样的问题。我正在将我的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