引き続き C#2.0。
匿名 delegate。期待の新機能である。
button1.Click += delegate { MessageBox.Show( "Click!") };なんて例が書いてあるので、期待が高まる。お。クロージャか?
試しに書いてみると。
delegate int acc_t(int x);
acc_t acc(int i)
{
acc_t f = delegate(int x) { return x + i; };
return f;
}
void test( int i )
{
int d = acc(i)(5); // d = i+5;
}となる。お。クロージャとして機能している。すばらしい。
しかし。
int d = ( delegate int( int x ){ return x; } )( 5 );とか書けそうなものだが、コンパイルエラー。
せっかくのクロージャがもったいない。
ヘルプ見ながら試行錯誤したところ、クロージャの定義をそのまま呼ぶには
int f = ((acc_t)delegate(int x) { return x; })(5);というような形にするしかないらしい。見ての通り、acc_t の宣言が必要である。
しかも。acc_t を宣言できるのは、メソッドの外側だけ。
その場でだけ必要なクロージャであったとしても、クラス内のどのメソッドからでも見える場所で acc_t を定義せねばならないらしい。
ああもったいない。
今後に期待。