私は次のことをかなり奇妙に感じました。繰り返しになりますが、私は主に動的言語でクロージャーを使用してきましたが、これは同じ「バグ」の疑いがあるべきではありません。以下は、コンパイラを不幸にします:
VoidFunction t = delegate { int i = 0; };
int i = 1;
それは言います:
「i」という名前のローカル変数をこのスコープで宣言することはできません。これは、「子」スコープで他の何かを示すために既に使用されている「i」に別の意味を与えるためです。
したがって、これは基本的に、デリゲート内で宣言された変数が宣言された関数のスコープを持つことを意味します。私が期待していたものとはまったく異なります。私は関数を呼び出そうとさえしていません。少なくとも Common Lisp には、変数を本当にローカルにしたい場合は、変数に動的な名前を付ける必要があると言う機能があります。これは、リークしないマクロを作成する場合に特に重要ですが、このような場合にも役立ちます。
だから、この問題を回避するために他の人が何をしているのか疑問に思っていますか?
明確にするために、デリゲートで宣言する変数がデリゲートの後に宣言された変数に干渉しないソリューションを探しています。そして、デリゲートの前に宣言された変数を引き続きキャプチャできるようにしたいと考えています。