2011-01-18 11 views
6


Ho la seguente classe:Perché Expression.And rappresenta "&", ma non "&&"

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

E sto creando e albero di espressione di tipo Expression<Func<Test, bool>> su questa classe. Quando faccio così:

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

ottengo il seguente vista di debug:

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

nota: c'è un && e-operation.
Quando faccio così:

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

ottengo il seguente vista di debug:

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

Nota: c'è & e-operation. Perché ricevo & nel secondo caso? Come modificare predicate2 per ottenere && anziché &?
Grazie in anticipo!

risposta

18

Perché è è& - cioè bit a bit/non cortocircuito "e". Per && si desidera Expression.AndAlso.

Vedere anche Expression.Or (|) vs Expression.OrElse (||).

Si noti inoltre che Expression = C# - è indipendente dalla lingua, per cui si potrebbe anche vedere alcuni casi in cui non si tornare (visivamente) ciò che ci si aspetta da C#.

3

L'operatore "&" e Expression.And rappresentano un bit a bit e. L'operatore "& &" e Expression.AndAlso rappresentano una logica (e corto taglio) e l'operatore.

5

Confronta Expression.And:

Crea un BinaryExpression che rappresenta un'operazione AND di bit.

e Expression.AndAlso:

Crea un BinaryExpression che rappresenta un condizionale AND che valuta il secondo operando solo se il primo operando restituisce true.

e quindi confrontare che alla vostra conoscenza degli operatori e &&&.

Problemi correlati