IEquatable<T>の典型実装とコードスニペット

2018/12/15追記

こちらにまとめなおしたので参照してください。

qiita.com


IEquatableの実装はややこしく、どうすればよいのかの情報が散乱していてよく混乱してしまうので、考慮もれなくきちんと実装できるようコードスニペット*1にまとめてある。ガイドライン付きで、要注意ポイントをコメントとして埋め込んである。C#7以降用。

今回改めて調べなおしたところ、最新の網羅性の高いガイドラインを見つけた。

docs.microsoft.com

構造体
  • Mutable: そもそも構造体はImmutable推奨*2なので考えない
  • Immutable: IEquatableを実装して、Equals()と==, !=演算子を両方実装する
クラス
  • Mutable: IEquatableを実装しないようにする(実装したい場合はクラスをImmutableにすべき)
  • Immutable: IEquatableを実装してよく、その場合はEquals()を実装するが、==, !=演算子については型が値として意味を持つ場合に限り実装する

というわけで、以下コードスニペット。構造体用とクラス用があって、それぞれショートカットはIEquatableStructIEquatableClass。貼りこんだ後、// TODOと書かれている箇所だけその型に合わせて実装すればよい。