私はこの回答を読み、それが強調する特定のケースを理解しました。これは、別のラムダ内にラムダがあり、誤って内側のラムダも外側のものとコンパイルしたくない場合です。外側のラムダ式をコンパイルするとき、内側のラムダ式を式ツリーのままにしておく必要があります。そうです、内側のラムダ式を引用するのは理にかなっています。
しかし、それはそれについてです、私は信じています。ラムダ式を引用する他のユースケースはありますか?
そうでない場合、すべての LINQ 演算子、つまり、クラスIQueryable<T>
で宣言されている拡張機能がQueryable
、その情報を にパッケージ化するときに引数として受け取る述語またはラムダを引用するのはなぜですかMethodCallExpression
。
私は例 (および過去数日間の他のいくつか) を試しましたが、この場合、ラムダを引用する意味がないようです。
唯一のパラメーターとして (デリゲート インスタンスではなく) ラムダ式を期待するメソッドへのメソッド呼び出し式を次に示します。
MethodCallExpression
次に、ラムダ内にラップしてコンパイルします。
LambdaExpression
しかし、それは内部(メソッドへの引数)もコンパイルしませんGimmeExpression
。内部ラムダ式を式ツリーとして残し、そのデリゲート インスタンスを作成しません。
実際、引用せずにうまく機能します。
そして、引数を引用すると、それが壊れて、間違ったタイプの引数をメソッドに渡していることを示すエラーが表示されますGimmeExpression
。
どうしたんだ?この引用は一体何ですか?
private static void TestMethodCallCompilation()
{
var methodInfo = typeof(Program).GetMethod("GimmeExpression",
BindingFlags.NonPublic | BindingFlags.Static);
var lambdaExpression = Expression.Lambda<Func<bool>>(Expression.Constant(true));
var methodCallExpression = Expression.Call(null, methodInfo, lambdaExpression);
var wrapperLambda = Expression.Lambda(methodCallExpression);
wrapperLambda.Compile().DynamicInvoke();
}
private static void GimmeExpression(Expression<Func<bool>> exp)
{
Console.WriteLine(exp.GetType());
Console.WriteLine("Compiling and executing expression...");
Console.WriteLine(exp.Compile().Invoke());
}