2011-01-18 3 views
6


Mam następujące klasy:Dlaczego Expression.And reprezentuje "&", ale nie "&&"

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

I tworzę i drzewa Expression typu Expression<Func<Test, bool>> w tej klasie. Kiedy robię to tak:

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

pojawia się następujący widok debug:

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

UWAGA: Istnieje && dla i-działania.
Kiedy robię to tak:

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))); 

pojawia się następujący widok debug:

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

Uwaga: Jest & dla i-działania. Dlaczego w drugim przypadku otrzymam &? Jak zmodyfikować predicate2, aby uzyskać && zamiast &?
Z góry dziękuję!

Odpowiedz

18

Ponieważ jest to jest& - tj. Bitowe/nie powodujące zwarcia "i". Dla && chcesz Expression.AndAlso.

Zobacz także Expression.Or (|) kontra Expression.OrElse (||).

Należy również pamiętać, że Expression = C# - jest niezależny od języka, więc może również zobaczyć kilka przypadków, w których robisz nie wrócić (wizualnie), czego można oczekiwać od C#.

3

Operator i wyrażenie "&". Reprezentują bitowe i. Operator i wyrażenie "& &" również są operatorem logicznym (i krótkim).

5

Porównaj Expression.And:

Tworzy BinaryExpression który reprezentuje bitowego i eksploatacji.

i Expression.AndAlso:

Tworzy BinaryExpression który reprezentuje warunkowe i operację, która ocenia drugiego argumentu tylko jeśli pierwszy operand wartość true.

Następnie porównaj to ze swoją wiedzą o operatorach & i &&.