は、以下のコードを検討:なぜ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演算子は実装していませんか?
なぜ言語/ツール/フレームワークが機能をサポートしているかサポートしていないのかというとスタックオーバーフローを尋ねるので、トピックをオフトピックとしてクローズします。 –
[なぜC#は機能Xを実装していないのですか?]という質問が常にあります。答えは常に同じです。誰もその機能を設計、指定、実装、テスト、文書化、出荷していないからです。それらのすべては、膨大な時間と労力とコストを要します。機能は安いものではなく、私たちは限られた時間、努力、お金の予算を考えれば、ユーザーに最高のメリットをもたらす機能だけを出荷しています。 - Eric Lippert](https://blogs.msdn.microsoft.com/ericlippert/2009/06/22/why-doesnt-c-implement-top-level-methods/) –
@ErikPhilips:叫び声に感謝しますが、これはまれな「なぜ」なのでしょうか?実際には相当な意味合いを持つ質問です。誰かがEqualsを実装するすべての問題に行きました。Equalsを単に呼び出すために==を実装するコストはかかりません。 C#/ .NETのやり方はやや奇妙でエラーを起こしやすいです。より優れた設計のシステムでは、 '=='、 '' Equals'、 'IComparable'などの実装に違いはありませんが、残念ながらあります。 –