2011-07-25 20 views
7

私は、==!=演算子をオーバーロードするクラスを実装しました。等価演算子のオーバーライド

これは正常に動作するようです。しかし、私は警告'type' defines operator == or operator != but does not override Object.Equals(object o)を得る。

さて、私はEqualsを実装しました。しかし今、私は警告を受ける'type' defines operator == or operator != but does not override Object.GetHashCode()

これはいつか終了しますか?または、私は==!=をオーバーロードしたいからといって、終わりのない道のりに迷い込んだことがありますか?

+3

簡単な用語の訂正:*演算子をオーバーライドしない - あなたは*それらをオーバーロードする*。 –

+1

'Equals'をオーバーライドする場合、ハッシュ関数に基づいて等価性をチェックするので、' GetHashCode'もオーバーライドする必要があります。 –

+0

@IgorisAzanovasいいえ、Equalsはハッシュ関数に基づいて等価性をチェックしません(オーバーロードしないように特別にコード化しない限り)。ハッシュ関数は、ハッシュされたコレクションをサポートするために存在し、一意の値を生成することは期待されていません。 – Suncat2000

答えて

10

これはいつか終了しますか?

はい、GetHashCodeを実装すると終了します。 Eric Lippertblogged about its importanceである。私ができることは、あなたが彼を読んで信頼することを提案することです:-)

+0

だから誰も、妥当なハッシュ値に整数値を変換するのに良いアルゴリズムを指すことができますか? –

+1

@Darinなぜ "=="演算子をオーバーロードするだけでobject.equals()をオーバーライドする必要がありますか? – Sandeep

+0

@Jonathon:あなたの唯一の識別情報が 'int'なら、組み込み' int'型はハッシュ値としてそれ自身を使います。それが彼らのために十分であれば... – porges

1

はい、それはGetHashCodeを上書きすると終了します。

等価演算子を実装する場合、さらにEqualsを実装する場合、その型のカスタムハッシュコードを提供する実装を提供するのはプログラマの責任です。

詳細はthis MSDN referenceを参照してください。

関連する問題