引き続き 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 を定義せねばならないらしい。
ああもったいない。
今後に期待。