Я тоже не уверен на 100%, но я думаю, что проблема заключается в том, чтобы при каждом соединении каждого выражения Func<T,bool>
параметр, который является экземпляром T , всегда был одним и тем же экземпляромдля каждого выражения.
Другими словами, для:
(t1 => t1>5).And(t2 => t2.Color == Blue)
мы предполагаем, что значения t1 и t2 равны, но InvocationExpression гарантирует, что они по сути говорят: «создайте новое выражение, котороевызывает expr2 с параметром из expr1".
См. также Повторное посещение PredicateBuilder , где автор, участник Mono, действительно явно проверяет наличиеэталонное равенство параметра.