2011-01-18 25 views
6


Tôi có lớp sau đây:Tại sao Expression.And đại diện cho "&" nhưng không "&&"

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

Và tôi tạo ra và cây Biểu hiện của loại Expression<Func<Test, bool>> trên lớp này. Khi tôi làm điều đó như thế này:

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

tôi có được cái nhìn debug sau:

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

lưu ý: có một && cho và tác.
Khi tôi làm điều đó như thế này:

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

tôi có được cái nhìn debug sau:

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

Lưu ý: có & cho và tác. Tại sao tôi nhận được & trong trường hợp thứ hai? Cách sửa đổi predicate2 để nhận && thay vì &?
Cảm ơn bạn trước!

Trả lời

18

Vì nó & - tức là bitwise/non-circuiting "và". Đối với && bạn muốn Expression.AndAlso.

Xem thêm Expression.Or (|) vs Expression.OrElse (||).

Ngoài ra, lưu ý rằng Expression = C# - đó là ngôn ngữ độc lập, vì vậy bạn có thể cũng thấy một số trường hợp bạn không trở lại (trực quan) những gì bạn mong chờ từ C#.

3

Toán tử "&" và Expression.And đại diện cho bitwise và. Toán tử "& &" và Expression.AndAlso đại diện cho toán tử logic (và cắt ngắn) và toán tử.

5

Hãy so sánh Expression.And:

Tạo một BinaryExpression đại diện cho một phép toán AND hoạt động.

Expression.AndAlso:

Tạo một BinaryExpression đại diện cho một điều kiện VÀ hoạt động mà đánh giá các toán hạng thứ hai chỉ khi toán hạng đầu tiên để đánh giá đúng.

Và sau đó so sánh điều đó với kiến ​​thức của bạn về các toán tử &&&.

Các vấn đề liên quan