==かEqualsか

Equals を使うな。使う事を推奨するな。[菊池 Blog]

以前に自分の日記でも言及したことがあるが、Javaと違ってC#はEquals(〜)メソッドのオーバライドと、オペレータオーバローディングの両方が可能なので、全ての型で"Equalsを使うな"とは必ずしも言えないのではないのだろうか。(菊池氏もそういう意味で、「よっぽどの理由が無い限り」と入れているのかもしれないが)

というのも、Visual Studio 2005のヘルプを見ると

組み込みの値型の場合、等値演算子 (==) ではオペランドの値が等しい場合に true が返され、それ以外の場合は false が返されます。string 以外の参照型の場合、== では 2 つのオペランドが同じオブジェクトを参照する場合に true が返されます。string 型の場合は、== は文字列の値を比較します。
[Microsoft Visual Studio 2005ドキュメント(C#リファレンス)より]

とある。
.NETの場合、コアクラスのソースコードは手元に無いし、逆アセンブルは禁止なので、このドキュメントを全面的に信頼すると、Stringクラス以外の参照型に関して、"=="演算子は参照等値を検証するだけであり、値を比較する訳では無い。(stringクラスの"=="はオーバロードされている、と捉えて良いのだろう)何より、参照型のEqualsメソッドは正しく型と同値を判断できるように、適切にオーバライドするのが普通だと思っている私は、使う際に誤解を生じやすかったり、"!="も同時にオーバロードしなければならない"=="オペレータオーバローディングよりも、Equalsメソッドの使用とオーバライドを選択するし、推奨すると思う。

確かに指摘されているサンプルでは、Equalsはそのままではタイプセーフでは無いが、それは値型と参照型の比較を安易に混在したことが問題なのではないだろうか。(個人的には値型でEqualsメソッドを使えるほうが、なにかおかしい感じがする)

従って、Equalsメソッドに敢えて注文をつけるならば

.NETの既定の値型でEqualsメソッドは使うな

くらいだと思うのだが、いかがだろう。

追記: トラックバックしたかったのだが、AILight Blogsへのトラックバック方法が未だに解らない。他のBlogのようにトラックバック用のURLが無いので、リンクに対してトラックバックしても上手くいかないのだが、これってFAQなのだろうか。