次のコードスニペットについて考えてみます。
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演算子を実装していないのはなぜですか?
要件が競合するため、_==
_演算子はライブラリに実装されていません。 _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
に追加するプルリクエストが拒否された理由です。
タプルの要素が_==
_による比較をサポートしている場合にのみ機能するコンパイラーでの_==
_の実装は、 コンパイラーのオープンプロポーザル ですが、単に機能していません。まだ実装されています。あまり活動がなく、実装されない理由は今のところないようですが、優先度が高くないだけです。