web-dev-qa-db-ja.com

C#で複合代入演算子をオーバーロードできないのはなぜですか?

タイトルは誤解を招く可能性があるため、質問全体をお読みください:-)

「複合代入演算子」によって、私はこのようなop=のような構造、たとえば+=を念頭に置いています。純粋な代入演算子(=)は私の質問に属していません。

「なぜ」とは、私が意見を意味するのではなく、一部のデザイナーまたはその同僚などがreasoning(つまり、デザインのソース)を表現するときのリソース(本、記事など)を意味します選択)。

C++とC#にある非対称に困惑しています(はい、C#はC++ 2.0ではないことを知っています)-C++では演算子+=をオーバーロードし、その後ほぼ自動的に以前に定義された演算子に依存して、適切な+演算子を記述します。 C#では逆です。+をオーバーロードすると、+=が合成されます。

新しいオブジェクトを作成する必要があるため、実際の+=の場合、私が間違っていない場合、後者のアプローチは最適化の機会を殺します。したがって、そのようなアプローチには大きな利点がいくつかあるはずですが、MSDNは恥ずかしがり屋でそれについて語ることができません。

そして、その利点は何なのかと思います。C#の本、tech-talkビデオ、ブログエントリで説明を見つけた場合は、参考にしていただければ幸いです。

私が見つけた最も近いものは、Eric Lippertブログのコメントです なぜオーバーロードされた演算子は常にC#で静的ですか? トムブラウン。静的なオーバーロードが最初に決定された場合は、構造体に対してどのオペレーターをオーバーロードできるかを単に指定します。これにより、クラスに何をオーバーロードできるかがさらに決まります。

11
greenoldman

これに関するリファレンスは見つかりませんが、私の理解では、C#チームは演算子のオーバーロードの適切なサブセットを提供したいと考えていました。当時、オペレーターの過負荷はラップが悪かった。人々はそれがコードを難読化し、悪のためにしか使用できないと主張しました。 C#が設計される頃には、Javaはno演算子のオーバーロードが煩わしいことを示していました。

したがって、C#は演算子のオーバーロードのバランスをとり、悪を行うのがより困難になるようにしたかったのですが、Niceのものも作成できました。割り当てのセマンティクスを変更することは、常に悪と見なされていたものの1つでした。 +=とその親族が過負荷になると、そのようなことが可能になります。たとえば、+=新しい参照を作成するのではなく、参照を変更しました。期待されるセマンティクスに従っていないため、バグが発生しました。

12
Telastyn