2011-01-18 11 views
6


que tienen la clase siguiente:¿Por Expression.And representa "Y", pero no "&&"

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

Y estoy creando y el árbol de expresión de tipo Expression<Func<Test, bool>> en esta clase. Cuando lo hago de esta manera:

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

me sale el siguiente vista de depuración:

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

nota: hay un && por e-operación.
Cuando lo hago de esta manera:

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

me sale el siguiente vista de depuración:

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

Nota: hay & por e-operación. ¿Por qué recibo & en el segundo caso? Cómo modificar predicate2 para obtener && en lugar de &?
¡Gracias de antemano!

Respuesta

18

Porque es& - es decir, en modo bit/sin cortocircuito "y". Para &&, quiere Expression.AndAlso.

Véase también Expression.Or (|) frente a Expression.OrElse (||).

Además, tenga en cuenta que Expression = C# - es independiente del lenguaje, por lo que podría también ver algunos casos en los que No volver (visualmente) lo que cabe esperar de C#.

3

El operador "&" y Expression.Y representan un bitwise y. El operador "& &" y Expression.And también representan un operador lógico (y de corte corto).

5

Compare Expression.And:

Crea un BinaryExpression que representa un bit a bit y operación.

y Expression.AndAlso:

Crea un BinaryExpression que representa una condicional y operación que evalúa el segundo operando sólo si el primer operando se evalúa como verdadera.

Y luego compararlo con el conocimiento de los & y && operadores.

Cuestiones relacionadas