鍋あり谷あり

テーマを決めずに適当に書いています。

匿名 delegate で closure だけど関数じゃない

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