2009-06-17 12 views
3

LINQコレクションで使用する単純なIEqulityComparerを実装しようとしています。私は私が持っている問題は 『GetHashCodeメソッド』の両方の機能がコンパイラの警告」機能を投げることである(または 『等しい』)...カスタムGeneric.IEqualityComparer(Of 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 

を議論の目的のためにその最も単純な形に還元され、次のコードを書かれています基本クラス 'Object'でオーバーライド可能なメソッドをシャドウします。基本クラスメソッドをオーバーライドするには、このメソッドを 'Overrides'と宣言する必要があります。

しかし、それらを上書きとして宣言すると、「関数 'GetHashCode'は、基本クラスの関数をオーバーライドしないため、オーバーライドを宣言できません」というエラーが表示されます。

「Implements」行で「getHashCode」を実装する必要があるというコンパイルエラーも発生していますが、これは最初の問題の結果であると推測します。

すべての私の研究は私が大丈夫でなければならないことを示しています - 誰も手がかりを得ていませんか?

答えて

1

[OK]を、関数の名前を変更し、それらを "実装"として宣言して並べ替えるように見えますが、これは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では、どのメソッドが実装されているかを明示的に実装する必要があります。あなたは同じ名前を使うことができます(それは奨励されています)、あなたはその 'implements'句を持っていなければなりません。

1

同じ問題が発生しています。私はC#コードをVB.Netに変換しています。 Implementsを追加しても役に立たなかった。 シャドウまたはオーバーロードを使用すると、すべての警告とエラーが削除されます。どちらの場合でも行動の違いは何だろうかと思います。 [上書き]を指定すると、エラーが発生します。 (オーバーライド、オーバーロード、シャドウ)のいずれも指定しないと警告が表示されます。

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