2012-03-02 10 views
3

私はJon Skeetの本を読んでいます。 (式ツリー章) それはラムダ式のうち、式ツリーを作成する例があります。式ツリー再利用値?

Expression<Func<string, string, bool>> expression = (x, y) => x.StartsWith(y); 
var compiled = expression.Compile(); 
Console.WriteLine(compiled("First", "Second")); 
Console.WriteLine(compiled("First", "Fir")); 

は今、彼は式ツリーと同じことをやっている:

enter image description here

質問:

黄色部分すでににはparams info!

なぜ私はの青色のにAGAINを指定する必要がありますか?

答えて

5

私はあなたの質問があると思う:

なぜExpression.Lambdaが パラメータ式に式全体-体を検査して、表現パラメータとしてそれらを使用するに手間の私を緩和することはできません明示的に再度Lambdaコールで手渡しますか?

まあ、それは確かに、しかし、それはどのように一般的なケースでは、これらのパラメータを受け入れるために何ために知っているだろうか?

(x, y) => x.StartsWith(y) 

(または)

(y, x) => x.StartsWith(y)? 

万一ごlambda.Compile()("42", "4")リターンtruefalse:あなたの例では

、どのようにそれは表現の等価を生成するかどうかを知っているだろうか?

通常の場合、あなたの代わりにこれらの決定を行うことはできません。

+0

この行 'Expression call = Expression.Call(target、method、methodArgs);'私は彼に命令されたものを教えました!最初はx、2番目はメソッド、3番目は引数です! –

+0

@Royi:これは、パラメータが*ラムダによって受け入れられる*順序ではなく、その特定のサブ式でパラメータがどのように使用されるかです。 – Ani