式ツリーを使用してデリゲートを作成する関数があります。この式の中で、関数に渡された複数のパラメーターからキャプチャされた変数を使用します。例として、実際の式ツリーはかなり大きいので、次のようになります。
Delegate GenerateFunction<T>(T current, IList<T> parents) {
var currentExpr = Expression.Parameter(typeof(T), "current");
var parentsExpr = Expression.Parameter(parents.getType(), "parents");
var parameters = new List<ParameterExpression>();
....
return Expression.Lambda(Expression.Block(new List<ParameterExpression> { parentsExpr, currentExpr }, ....), parameters.ToArray()).Compile();
}
次に、このメソッドを別のメソッドから呼び出してから、その関数を別の関数に渡して使用します。それがすべて終わったら、式ツリー内で更新される親のコンテンツにアクセスしたいと思います。
すべてがコンパイルされているようで、式は問題ないように見えますが、実行すると、(式/クロージャー内の)親変数にアクセスするときにnull参照例外が発生しているように見えます(実際にはわかりませんが)。
何か間違ったことをしているのか、それが可能かどうか、そして何が起こっているのかを理解するためのヒントを知りたいと思います。メソッド内でホイストされた(?)ローカル変数を見つけることができないようですので、それらがキャプチャされているかどうか疑問に思っていますか?
ありがとう、マーク