IEquatable<T>インターフェースで実装されるEqualsメソッドは、==
, !=
(<>
) といった等価・不等価演算子の役割と似たものですが、両者は全く独立したものであり、このインターフェイスを実装したからといって等価演算子を用いた比較が出来るようになるわけではありません。 等価演算子を用いて比較するには、別途演算子をオーバーロードしなければなりません。 また逆に、等価演算子・不等価演算子をオーバーロードしたからといってList.Containsメソッドで要素の有無をチェックしたり、Dictionaryのキーとして使えるようになるというわけでもありません。 List.Containsメソッドで要素の有無を調べられるようにするには少なくともEqualsメソッド、Dictionaryのキーとして使用するにはEqualsメソッドとGetHashCodeメソッドの両方が適切に実装されている必要があります。
しかし、独自のクラスを構築する際、IEquatable<T>等による比較と等価演算子による比較の両方が出来るようにしたい場合も当然出てきます。
以下の例では、IEquatable<T>の実装と等価・不等価演算子のオーバーロードを行った構造体を作成しています。 この構造体では、等価演算子で等価性の定義と比較処理を実装し、IEquatable<T>.Equalsメソッドではオーバーロードした等価演算子を使って結果を返すようにしています。
なお、この例では構造体での等価演算子のオーバーロードを行いましたが、参照型でのオーバーロードを行う場合は x == y が参照の等価性(つまり同一のインスタンス)を表すのか、インスタンスの持つ値の等価性を表すのか曖昧になる場合がある点に注意が必要です。
もう一つ別の例を挙げます。 次の例において、Point構造体では等価・不等価演算子のオーバーロードのみを行い、キーとしての比較で必要となる処理はEqualityComparer<T>クラスを継承した別のクラスPointComparerで実装しています。