C# 機能要望@2ch
昨日、2ch の C# スレとかで、C# に今後こういう機能が入って欲しいなぁという話が出てたんですけど、それを紹介。
クロージャでイテレータ
クロージャ、要するに匿名デリゲート/ラムダ式中で yield return を使いたいという話。↓みたいな。
Func<object, int, IEnumerable> repeat = (object x, int n) => { while(n-- > 0) yield return x; } var q = repeat(0, 10);
まあ、これは、MS の中の人も「できるようにしておけばよかった」と思ってるみたいなので、そのうち対応されるかも。
イテレータのネスト
イテレータの中で別のイテレータを呼び出したい。↓のコードで 0, 1, 2, 2, 2 ってシーケンスが得られるような構文糖衣。
IEnumerable<T> Repeat<T>(T x, int n) { while (n-- > 0) yield return x; } IEnumerable<int> ListUp() { yield return 0; yield return 1; yield Repeat(2, 3); }
要するに、yield e;
で、foreach (var x in e) yield return x;
相当の動作をして欲しい。
イテレータを fiber/microthread 的な使い方したいときに、イテレータの中で別のイテレータをサブルーチン的に使えないのが結構面倒(いちいち foreach (var x in e) yield return x; が必要)。
この用途だと、ついでに言うと return なしの yield も欲しかったりするんですが。C# の仕様だと、yield return null; とか、戻り値不要な場合でも無意味な値返しておかないと駄目だし。
IEnumerable の省略形が欲しい
これは昨日じゃなくて、前々から言われてることだけど、LINQ の登場に伴って IEnumerable
C# 3.0 では、var で型推論できるようになったから、それほど頻出するわけではないですけども。型推論ってラムダ式とかジェネリクスとは相性悪いんで、このあたりの機能を多用していると var が使えないことも多いんで。
T* とかがよさげに思えるけども、C# にはポインタがあるからなぁ・・・。T! とか T~ とか?
拡張メソッドを、内部クラス中で定義したい。
要するに、スコープをクラス内部に限定したい。
拡張メソッドって、なんで内部クラス中に定義できないんだろう。クラス内限定で使いたい拡張メソッドを定義できて便利そうなのに。
internal なクラス中に拡張メソッドを定義しておけば、近いことはできますけども・・・。