C# 機能要望@2ch

昨日、2chC# スレとかで、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 をよく使うようになったんで、これの省略形が欲しいという意見はたびたび出てる。Nullable が T? で書けるんだから、IEnumerable も何か簡単に書ける記法を用意してほしい。

C# 3.0 では、var で型推論できるようになったから、それほど頻出するわけではないですけども。型推論ってラムダ式とかジェネリクスとは相性悪いんで、このあたりの機能を多用していると var が使えないことも多いんで。

T* とかがよさげに思えるけども、C# にはポインタがあるからなぁ・・・。T! とか T~ とか?

拡張メソッドを、内部クラス中で定義したい。

要するに、スコープをクラス内部に限定したい。
拡張メソッドって、なんで内部クラス中に定義できないんだろう。クラス内限定で使いたい拡張メソッドを定義できて便利そうなのに。

internal なクラス中に拡張メソッドを定義しておけば、近いことはできますけども・・・。

メソッド名にも名前空間みたいなものが欲しい

メソッドが多くなりすぎたときに、その分類のために、クラス内に名前空間を持ちたいって話。

まあ、それが必要なほどでかいクラス書くなって話もあるし、(利用者側から見えないけども、クラス定義側では)#region で我慢しろってのもありますけど。

おまけ

C# と関係ないけども、Microsoft Math 3.0 って日本語版出ないんですかね?

売れるかどうかはおいといて、出すだけ出しといたら、日本の研究・教育機関の異常なほどのアンチ MS ムードの緩和につながる気もしますし。値段安い割には、記号計算・数値計算ともにそこそこ機能持ってるみたいだし。

それに、Math Add-in、Word 用しかないんですか?Excel とか PowerPoint から使いたいんですが。s=\sum_(i=1)^n a_i とか入力したら、自動で TeX 的に組み版してくれるのが結構便利なんで、MS Equation の置き換えとして。