2012-11-16 10 views
8

可能性の重複:
Is it necessary to override == and != operators when overriding the Equals method? (.NET)なぜオーバーライド==はequalsをオーバーライドする必要がありますか?

C#コンパイラは、私はオーバーライドする必要があることを私に求められますオーバーライド==が、私は理由を知りたい場合は等しいですか?

+3

可能な複製:http://stackoverflow.com/q/1222035/238902 – Default

+1

@Default実際には、重複しているとは思われませんが、リンクされています。これは「==を提供するとき、等価をオーバーライドする必要がありますか?」です。 (答えは一般的には:はい)、他のものは「Equalsを上書きするときは、==? (答えは一般的に:いいえ、本当にありません) –

答えて

4

そうでないと、意味の異なる2つの操作が異なる結果を招く可能性があります。つまり、多くの混乱が生じます。

コンパイラがあなたを止めるかどうか、またはそれが単なる警告であるかどうかはわかりませんが、どちらの場合でも同じように動作することを確認するのが普通です。

double.NaN == double.NaNdouble.NaN.Equals(double.NaN)のようなものがあります。あなたがいる場合は

+0

+1:興味深いことに、私は 'double.NaN.Equals(double.NaN)== true'を認識しませんでした。 – Henrik

12

==経由平等を再定義し、それは==.Equalsに非常に異なる何かをしなければ混乱本当に取得し、.Equalsは型がコンパイル時に知られていない場合、唯一の.Equalsがあるので、フォールバックである必要があります利用可能です。結果として、==を定義することは、==,!=,EqualsおよびGetHashCodeを定義し、場合によってはIEquatable<T>を一部のTに実装することを意味します。

+0

+1うん、 'double.NaN'はあなたが間違っているとき刺されます:-) –

+0

' == 'と' Equals'はすべての状況で同じように動作することはできません。 。もっと便利なのは、 '=='が使用可能な場所で一貫していることと、どこでも一貫性があるように '等しい'であることです(どこでも使えるので)。同じ数字を表す数値型は '=='を比較しなければならないというルールは、他の点で違いがあっても100%のものだけが 'Equals'と比較されるべきであるというルールは、今存在するmishmoshよりも役立ちます。 – supercat

+0

それはそのままです。ディクショナリは数字「1.0m」と「1.00m」(文字列表現が異なるはずである)を区別できないため、文字列表現に 'Decimal'値をマップする辞書です。 '=='演算子はそれらの値を等しいとみなすべきですが、それは 'Equals'を意味するものではありません。さらに、 '=='過負荷が定義される方法は、等価関係を実装することができず、数値平等を実際にはテストしません。 '16777217 == 16777216.0f'です。 – supercat

1

そうでないと、比較の仕方によって結果が異なるためです。

Doing x == yは、y == xxyが異なるタイプの場合)と異なる結果をもたらす可能性があります。リスト内の値を探したり、辞書のキーとして使用したりするなど、他の比較では==演算子を使用しないため、まったく動作しません。

+0

なぜ違いますか?何をすべきか? –

+0

@MatíasFidemraizer: 'x == y'は' x'値に対して '=='演算子を使用するので、 'y == x'は' y'値に対して '=='演算子を使います。それらが異なって実装されている場合(例:'y'はデフォルトのオブジェクト比較を使用します)、それらは異なる結果を与えます。 – Guffa

+0

ああ、そうだ。しかし、これは 'x'と' y'が異なる型を持つ場合に起こります。どちらも同じ型の場合、 'x == y'または' y == x'は同じように動作するはずです。多分あなたは私たちの答えでこれを指摘するべきでしょう。 –

関連する問題