为什么Expression.And代表"&"但不代表"&&"

Stu*_*ens 6 .net c# expression-trees


我有以下课程:

public class Test
{
    public string Text { get; set; }
    public int Number { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我正在Expression<Func<Test, bool>>这个类上创建类型和表达式树.当我这样做时:

Expression<Func<Test, bool>> predicate1 = x => x.Text.Length > 5 && x.Number > 0;
Run Code Online (Sandbox Code Playgroud)

我得到以下调试视图:

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

注意:有一个&&for和-opend.
当我这样做时:

    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)));
Run Code Online (Sandbox Code Playgroud)

我得到以下调试视图:

($var1.Text).Length > 5 & $var1.Number > 0
Run Code Online (Sandbox Code Playgroud)

注意:这是&为了和操作.为什么我要&进入第二种情况?如何修改predicate2获得&&,而不是&
提前致谢!

Mar*_*ell 19

因为它 & - 即按位/非短路"和".对于&&你想Expression.AndAlso.

另见Expression.Or(|)vs Expression.OrElse(||).

另外,请注意Expression!= C# - 它与语言无关,因此您可能还会看到一些情况,即您没有(视觉上)回复您对C#的期望.


Dam*_*ver 5

比较Expression.And:

创建表示按位AND运算的BinaryExpression.

Expression.AndAlso:

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

然后比较,为你的知识&&&经营者.