2017-02-10 5 views
17

は、以下のコードを検討:なぜC#7 ValueTuplesはEqualsメソッドを実装しますが、double equals演算子は実装しないのですか?

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 

最初の二つは、パスをアサートします。 3つ目はコンパイルされません。

なぜValueTupleはカスタムEqualsメソッドを実装しますが、double equals演算子は実装していませんか?

+0

なぜ言語/ツール/フレームワークが機能をサポートしているかサポートしていないのかというとスタックオーバーフローを尋ねるので、トピックをオフトピックとしてクローズします。 –

+2

[なぜC#は機能Xを実装していないのですか?]という質問が常にあります。答えは常に同じです。誰もその機能を設計、指定、実装、テスト、文書化、出荷していないからです。それらのすべては、膨大な時間と労力とコストを要します。機能は安いものではなく、私たちは限られた時間、努力、お金の予算を考えれば、ユーザーに最高のメリットをもたらす機能だけを出荷しています。 - Eric Lippert](https://blogs.msdn.microsoft.com/ericlippert/2009/06/22/why-doesnt-c-implement-top-level-methods/) –

+10

@ErikPhilips:叫び声に感謝しますが、これはまれな「なぜ」なのでしょうか?実際には相当な意味合いを持つ質問です。誰かがEqualsを実装するすべての問題に行きました。Equalsを単に呼び出すために==を実装するコストはかかりません。 C#/ .NETのやり方はやや奇妙でエラーを起こしやすいです。より優れた設計のシステムでは、 '=='、 '' Equals'、 'IComparable 'などの実装に違いはありませんが、残念ながらあります。 –

答えて

29

矛盾する要件のため、==演算子はライブラリに実装されていません。 var tuple1 = (x, y); var tuple2 = (x, y);tuple1.Equals(tuple2)trueである場合、object.Equalsを正しく実装するxyのすべてについて(参照比較のままにしても)。しかし、tuple1 == tuple2(実装されている場合)は、x == x && y == yと同じである必要があります。後者はではなく、が常にtrueです。具体的には、xまたはydouble.NaNの場合はfalseです。これがa pull request adding an operator ==ValueTupleが拒否された理由です。

タプルの要素が==でサポートされている場合にのみ動作するコンパイラで==を実装すると、an open proposal for the compilerになりますが、まだ実装されていません。活動があまり行われていない理由は、現在実施されていない理由はないようですが、それは単に優先順位が高くありません。

+3

"これは確立された大会と矛盾しています"とは、Roslynチームが 'ValueTuple'構造体を変更可能にすることを止めないため、Neil Grafterのかなり弱い議論です。それは別として、決定の背後にある「論理」を説明しているように、これは答えのスポットです。 –

+0

ありがとう!プルリクエストへのリンクは、まさに私が探していて見つけられなかった説明でした。 –

+0

オプション2、点の等価性は非常に賢明だが、言語サポートが必要なので、実装されるまでタプルフィーチャの導入を遅らせると意味があります。 –

関連する問題