2

PredicateBuilderのソースを調べたところ、その実装に興味をそそられました。Or メソッドの実装を見てみましょう。

public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
                                                      Expression<Func<T, bool>> expr2)
  {
    var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
    return Expression.Lambda<Func<T, bool>>
          (Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
  }

述語本体に OrElse を使用するだけでなく、新しいラムダを呼び出すのはなぜですか?

4

2 に答える 2

4

私はそれがタイピングの問題だと信じています:Expression.OrElseではなく、プレーンな式を返しますExpression<Func<T, bool>>

于 2010-10-26T22:04:31.807 に答える
0

私も100%確信はありませんが、問題は、各式Func<T,bool>がチェーンされているため、Tのインスタンスであるパラメーターが各式で常に同じインスタンスであることを保証することだと思います。

つまり、次の場合です。

(t1 => t1>5).And(t2 => t2.Color == Blue)

t1 と t2 は参照的に等しいと仮定しますが、InvocationExpression は、本質的に「expr1からのパラメーターでexpr2を呼び出す新しい式を作成する」ことによって、それらが等しいことを保証します。

PredicateBuilderも参照してください。Monoの寄稿者である作成者が、パラメーターの参照の等価性を実際に明示的にチェックする場所を再訪しました。

于 2011-07-09T07:52:23.163 に答える