为什么Expression.And代表“&”但不是“&&”

时间:2011-01-18 11:53:59

标签: c# .net expression-trees


我有以下课程:

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 个答案:

答案 0 :(得分:19)

因为 & - 即按位/非短路“和”。对于&&,您需要Expression.AndAlso

另请参阅Expression.Or|)vs Expression.OrElse||)。

另请注意Expression!= C# - 它与语言无关,因此您可能查看取回的某些情况(视觉上)您对C#的期望。

答案 1 :(得分:5)

比较Expression.And

  

创建一个表示按位AND操作的BinaryExpression。

Expression.AndAlso

  

创建一个BinaryExpression,它表示一个条件AND操作,仅当第一个操作数的计算结果为true时才会计算第二个操作数。

然后将其与您对&&&运算符的了解进行比较。

答案 2 :(得分:3)

“&amp;” operator和Expression.And表示按位和。 “&amp;&amp;” operator和Expression.AndAlso表示逻辑(和短切)和运算符。