Почему Expression.And представляет «&», но не «&&» - PullRequest
6 голосов
/ 18 января 2011


У меня есть следующий класс:

public class Test
{
    public string Text { get; set; }
    public int Number { get; set; }
}

И я создаю и дерево выражений типа Expression<Func<Test, bool>> для этого класса.Когда я делаю это следующим образом:

Expression<Func<Test, bool>> predicate1 = x => x.Text.Length > 5 && x.Number > 0;

, я получаю следующее представление отладки:

.Lambda #Lambda1<System.Func`2[NHLinqTest.Test,System.Boolean]>(NHLinqTest.Test $x) {
    ($x.Text).Length > 5 && $x.Number > 0
}

Примечание: есть && для и-операции.это так:

    var y = Expression.Parameter(typeof(Test));

    var predicate2 = Expression.And(
        Expression.GreaterThan(
            Expression.Property(Expression.Property(y, "Text"), "Length"),
            Expression.Constant(5)),
    Expression.GreaterThan(
        Expression.Property(y, "Number"),
            Expression.Constant(0)));

Я получаю следующее представление отладки:

($var1.Text).Length > 5 & $var1.Number > 0

Примечание: есть & для операции и.Почему я получаю & во втором случае?Как изменить predicate2, чтобы получить && вместо &?
Заранее спасибо!

Ответы [ 3 ]

19 голосов
/ 18 января 2011

Потому что это равно & - то есть поразрядно / без короткого замыкания "и".Для && вы хотите Expression.AndAlso.

См. Также Expression.Or (|) против Expression.OrElse (||).

Также обратите внимание, что Expression!= C # - он не зависит от языка, поэтому вы можете также увидеть некоторые случаи, когда вы не получаете (визуально) то, что ожидаете от C #.

5 голосов
/ 18 января 2011

Сравнить Expression.And :

Создает двоичное выражение, представляющее побитовую операцию И.

и Expression.AndAlso :

Создает BinaryExpression, представляющий условную операцию AND, которая оценивает второй операнд, только если первый операнд оценивается как true.

И затем сравнивает это с вашимзнание операторов & и &&.

3 голосов
/ 18 января 2011

Оператор «&» и Expression.And представляют побитовое и.Оператор "&&" и Expression.AndAlso также представляют логический (и сокращенный) и оператор.

...