ラムダ式の「ルール」は、c# コンパイラ (または使用している言語) の一部です。式自体には、コンテキストの自動認識はありません。代わりに、変数を「キャプチャ」すると、つまりx
以下のようになります。
int x = ...
Expression<Func<Foo, bool>> predicate = obj => obj.Bar == x;
コンパイラは、生成されたコンテキスト クラスのインスタンスを作成し、それを使用ConstantExpression
してツリーに関連付けます。
// approximate representative code; not literal translation
var ctx = new SomeContext();
ctx.x = ... // x is actually a public instance field of SomeContext
var param = Expression.Parameter(typeof(Foo), "obj");
var predicate = Expression.Lambda<Func<Foo, bool>>(
Expression.Equal(
Expression.PropertyOrField(param, "Bar"),
Expression.PropertyOrField(Expression.Constant(ctx), "x")
), param);
コンテキスト インスタンスを「交換」する唯一の方法は、通常はExpressionVisitor
. また、ネストされたスコープは、チェーンされたコンテキスト オブジェクトを含む、より複雑なシナリオにつながる可能性があることに注意してください。
個人的に; これについて心配する必要はないと思います。