2009-06-17 42 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