В C#, &
является бинарным оператором, и выражение tress mirror C#.
Таким образом, C# выражение a & b & c
, которое левоассоциативные, на самом деле означает (a & b) & c
, и с помощью деревьев выражений:
Expresssion.And(Expression.And(a, b), c)
Обратите внимание, что если вы имели в виду, чтобы создать дерево выражения для оператора &&
, который также делает короткое замыкание, вы должны использовать AndAlso
.
Замечание: Самый простой способ узнать, как построить деревья выражений, - это использовать сам компилятор C#. Например, просто скомпилировать этот кусок кода:
Expression<Func<bool>> e =() => a & b & c;
и исследовать полученную сборку в инструменте декомпилятора (такие как ILSpy). Просто не забудьте отключить любые оптимизации, которые обрабатывают деревья выражений обратно в код.
Поскольку все бинарные операторы в C# являются лево-ассоциативными, я бы использовал 'And (And (x, y), z)' вместо 'And (x, And (y, z))'. – Heinzi
В чем отличие «And (And (x, y), z)» и «And (x, And (y, z))' –
@ Azerty123: В этом конкретном случае обе будут иметь одинаковый результат и сторону -эффекты, поскольку двоичный И является ассоциативной операцией, которая не является короткозамкнутой. – Heinzi