タイトルは誤解を招く可能性があるため、質問全体をお読みください:-)。
「複合代入演算子」によって、私はこのようなop=
のような構造、たとえば+=
を念頭に置いています。純粋な代入演算子(=
)は私の質問に属していません。
「なぜ」とは、私が意見を意味するのではなく、一部のデザイナーまたはその同僚などがreasoning(つまり、デザインのソース)を表現するときのリソース(本、記事など)を意味します選択)。
C++とC#にある非対称に困惑しています(はい、C#はC++ 2.0ではないことを知っています)-C++では演算子+=
をオーバーロードし、その後ほぼ自動的に以前に定義された演算子に依存して、適切な+
演算子を記述します。 C#では逆です。+
をオーバーロードすると、+=
が合成されます。
新しいオブジェクトを作成する必要があるため、実際の+=
の場合、私が間違っていない場合、後者のアプローチは最適化の機会を殺します。したがって、そのようなアプローチには大きな利点がいくつかあるはずですが、MSDNは恥ずかしがり屋でそれについて語ることができません。
そして、その利点は何なのかと思います。C#の本、tech-talkビデオ、ブログエントリで説明を見つけた場合は、参考にしていただければ幸いです。
私が見つけた最も近いものは、Eric Lippertブログのコメントです なぜオーバーロードされた演算子は常にC#で静的ですか? トムブラウン。静的なオーバーロードが最初に決定された場合は、構造体に対してどのオペレーターをオーバーロードできるかを単に指定します。これにより、クラスに何をオーバーロードできるかがさらに決まります。
これに関するリファレンスは見つかりませんが、私の理解では、C#チームは演算子のオーバーロードの適切なサブセットを提供したいと考えていました。当時、オペレーターの過負荷はラップが悪かった。人々はそれがコードを難読化し、悪のためにしか使用できないと主張しました。 C#が設計される頃には、Javaはno演算子のオーバーロードが煩わしいことを示していました。
したがって、C#は演算子のオーバーロードのバランスをとり、悪を行うのがより困難になるようにしたかったのですが、Niceのものも作成できました。割り当てのセマンティクスを変更することは、常に悪と見なされていたものの1つでした。 +=
とその親族が過負荷になると、そのようなことが可能になります。たとえば、+=
新しい参照を作成するのではなく、参照を変更しました。期待されるセマンティクスに従っていないため、バグが発生しました。