Array.ConvertAll

 本当に使いにくいなんてもんじゃない。

TOutput[] Array.ConvertAll<TInput, TOutput>(TInput[] input, Converter<TInput,TOutput> converter)

 シグネチャはこんなんだ。実際に使うと、

int[] ints = new int[]{1,5,3};

string[] strs = Array.ConvertAll<int,string>(ints, 
  delegate(int i){
    return i.ToString();
  });

 こんな感じだ。とにかく視認性が悪い。

string[] strs = Array.ConvertAll(ints, delegate(int i){ return i.ToString(); });

 こうさせてくれればいいのだが、匿名メソッドは型推論に関わらないのでこれでは推論が出来ない。戻り値での推論もしてくれない。

 型引数を二つも取ったら一つの文には見えなくなる。なんかごちゃごちゃしたわけわからん入れ子の文にみえる。List.ConvertAllならば型引数一個でいいから何とか見える。

 本当はC#2.0はこうだった気がする。

string[] strs = Array.ConvertAll(ints, new Converter<int, string>(int i){ return i.ToString(); });

 なんで型をはっきり示したデリゲートを内部に直でかけなくしたのだろう。

 しかたがないので、少しでも視認性を上げるために、型引数の位置を移す。

string[] strs = Array.ConvertAll(ints, new Converter<int, string>(
  delegate(int i){ 
    return i.ToString(); 
  }));

 カッコの数が増えるのがうざいけど、いくらかはマシになる。というかなんでこんな欠陥仕様にしたんだろう。

 はやくこうさせてくれ。

var strs = Array.ConvertAll(ints, i => i.ToString() );

 うわー、すっきりする。すっきりするよ。拡張メソッドも使えば、

var strs = ints.ConvertAll(i => i.ToString());

 もう信じがたいぐらいすっきりするよ。匿名メソッドとかいらねーからはやくラムダをくれ。

 つってもやっぱり

string[] strs = ints.ConvertAll(i => i.ToString());

 こっちのほうがいいな。型推論で間違えないために。varはちょっと微妙かな。

string[] strs = ints.ConvertAll( (int i) => i.ToString());

 このくらいまで書いたほうがいいのかな。多少読みづらいな。

 匿名メソッドが型推論に関わらないのはラムダへの伏線なのだよな。同じ機能を持った言語要素は作らないというヘジさんのポリシーらしいけど、そのせいでC#2.0はひどい欠陥品になってしまっている。