1

CreateExpression()構築された式ツリーを返す式パーサーを構築しました

Expression rule = CreateExpression(_BuyRuleString);
LambdaExpression lambda = Expression.Lambda(rule, _ParameterExpressions);
var func = lambda.Compile();

lambda.Compile()しかし、エラーで呼び出すと失敗しました

variable 't1' of type 'System.Int32' referenced from scope '', but it is not defined

だから私は式を印刷しますlambda

.Lambda #Lambda1<System.Func`9[System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Double,System.Double,System.Boolean[]]>(
System.Int32 $t1,
System.Int32 $t2,
System.Int32 $t3,
System.Int32 $t4,
System.Int32 $t5,
System.Int32 $t6,
System.Double $r1,
System.Double $r2) {
.Call SwarmTrader.ExpressionParser.SeriesOperatorFunc.GTZ(.Call SwarmTrader.Indicator.RSI(
        $t1,
        "p"))
}

に相当する

Expression<Func<int, int, int, int, int, int, double, double, bool[]>> test = (t1, t2, t3, t4, t5, t6, r1, r2) => SwarmTrader.ExpressionParser.SeriesOperatorFunc.GTZ(SwarmTrader.Indicator.RSI(t1, "p"));

しかし、var func = test.Compile();動作します。ということで組み合わせて解決してみると……

lambda = Expression.Lambda(rule, _ParameterExpressions); // lambda.Compile() failed
lambda = Expression.Lambda(test.Body, _ParameterExpressions); // lambda.Compile() failed
lambda = Expression.Lambda(rule, test.Parameters); // lambda.Compile() failed
lambda = Expression.Lambda(test.Body, test.Parameters); // lambda.Compile() works

lambda.Compile()からしか機能しない理由を誰でも指摘できますtestか?

4

1 に答える 1

4

ほとんどの場合CreateExpression()、 にあるパラメーターを参照していませんが_ParameterExpressions、代わりに独自のパラメーターを定義しています。コンパイルしている式ツリーとラムダ引数で同じ ものを使用する必要があります。ParameterExpression

于 2012-09-01T18:03:43.883 に答える