C++は、言語拡張にとても慎重だ。
ライブラリでカバーできることはライブラリでやる、という哲学がある。
C#は、割とホイホイ言語機能を拡張する。
もちろん、開発しているのが事実上Microsoftだけだから可能という要素もある。
ネタ元:【落とし穴】 イテレータはラムダ式、匿名メソッド内では使えない
「yieldステートメントは、匿名メソッドまたはラムダ式の内部では使用できません」というエラーがでている。
どうしてダメなんだろうか。
それはきっと、yieldはプログラマの知らないうちに匿名クラスを作っていて云々とか、そういうよくわからない理由があるのかもしれない。
直感的には、使えてもいい文脈だと思う。が、処理系の実装上、ダメ。そういうのは汚い。
言語拡張が悪いことだとは言わない。
けれど、一見できても良さそうなことが、こっちの場合にはOKだけどこっちの場合にはダメとか、いわゆる忌み嫌われる「場合分け」が多くなってきてるんじゃないかと思う。
switch文で幾度も分岐しているような感じがする。
そんなのはコンパイラを作る人も大変でしょう。
C++はD&Eなんかで、「どうしてそういう設計になっているのか」が説明されている。
「The D&E C#」が是非とも読んでみたい。DとEにF(Future)もつけてくれるといいな。
どうですかね>ヘジたん