web-dev-qa-db-ja.com

C#7 ValueTuplesがEqualsメソッドを実装しているのに、doubleequals演算子を実装していないのはなぜですか?

次のコードスニペットについて考えてみます。

var Tuple1 = (7, "foo");
var Tuple2 = (7, "foo");
var Tuple3 = (42, "bar");

Assert.That(Tuple1.Equals(Tuple2), Is.True);    //This passes
Assert.That(Tuple1.Equals(Tuple3), Is.False);   //This passes

Assert.That(Tuple1 == Tuple2, Is.True);         //This does not compile

最初の2つのアサートは合格です。 3番目のものはコンパイルされません。

ValueTupleがカスタムEqualsメソッドを実装しているのに、doubleequals演算子を実装していないのはなぜですか?

21
Jon Turner

要件が競合するため、_==_演算子はライブラリに実装されていません。 _object.Equals_を正しく実装するすべてのxおよびyについて(参照比較として残した場合でも)、var Tuple1 = (x, y); var Tuple2 = (x, y);が与えられると、Tuple1.Equals(Tuple2)true。ただし、_Tuple1 == Tuple2_は、実装されている場合は_x == x && y == y_と同等である必要があります。後者はnot常に真です。具体的には、xまたはyが_double.NaN_の場合はfalseです。これが、 _operator ==_ValueTupleに追加するプルリクエストが拒否された理由です。

タプルの要素が_==_による比較をサポートしている場合にのみ機能するコンパイラーでの_==_の実装は、 コンパイラーのオープンプロポーザル ですが、単に機能していません。まだ実装されています。あまり活動がなく、実装されない理由は今のところないようですが、優先度が高くないだけです。

37
user743382