DCSIMG
ExpressionType.And VS ExpressionType.AndAlso - Ido Flatow's Blog Veni Vidi Scripsi

Ido Flatow's Blog

Veni Vidi Scripsi

News

Have you heard me speak?
Powered
<style type='text/css' media='screen' id='sm_css'> #smix {overflow: visible;height: auto;border-radius: 10px;max-width: 250px;background-color: #323232;text-align: left;font-size: 12px;line-height: 16px;font-family:'Lucida Sans Unicode','Lucida Grande',Verdana,Arial,Helvetica,sans-serif;-webkit-border-radius: 10px;-moz-border-radius: 10px;border-radius: 10px;} #smix a {color: #0056CC;text-decoration: none;} #smix .sm_head {color: #fff; line-height: 1em;font-size: 1.4em;padding: 10px;color: #fff;} #smix .sm_lanyard_wrapper {background-color: #fff;;clear: both;width: 97%;margin: 0 auto;margin-bottom: 0px;} #smix .sm_lanyard_content {padding: 7px;}#smix button.sm_rec, #smix a.sm_rec, #smix input[type=submit].sm_rec { padding: 6px 10px; -webkit-border-radius: 2px 2px;-moz-border-radius: 2px; border-radius: 2px; border: solid 1px rgb(153, 153, 153); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(255, 255, 255)), to(rgb(221, 221, 221))); color: #333; text-decoration: none; cursor: pointer; display: inline-block; text-align: center; text-shadow: 0px 1px 1px rgba(255,255,255,1); line-height: 1; }#smix .sm_rec:hover { background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(248, 248, 248)), to(rgb(221, 221, 221))); }#smix .sm_rec:active { background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(204, 204, 204)), to(rgb(221, 221, 221))); }#smix .sm_rec.medium { padding: 3px 7px; font-size: 13px; }#smix .sm_rec span.icon.thumbs_up {background-position: 0px 36px;vertical-align: text-top;display: inline-block;margin-right: 4px;height: 18px;width: 16px;background-image: url(http://speakermix.com/images/new/thumbsold.png);}#smix .sm_rec:hover span.icon.thumbs_up {background-position: 0px 18px;} #smix .sm_events {padding:2px 0px 4px 0px;} #smix .sm_section {font-size: 10px; border-bottom: 1px solid silver; margin-bottom: 6px;} #smix .sm_subline {font-size:120%;margin-top:4px;font-weight:bold} #smix .powered {text-align: right} #smix .powered img {margin: 7px} </style>
Sela Technology Center

Advertisement

ExpressionType.And VS ExpressionType.AndAlso

Today I’ve encountered a strange problem running expressions - I wanted to created an expression tree that looks something like this:

(e) => e.Owner != null && e.Owner.ID = 4455

So I’ve used the Expression.MakeBinary method to create a binary expression and passed it an ExpressionType.And enum, thinking this is the C# “&&” operator.

When running the expression on an e instance that had no owner (null), I got an exception. When looking at the created expression it looked something like this:

(e) => e.Owner != null AND e.Owner.ID = 4455

At first I didn’t notice any difference (I just thought the ToString() created an easy-to-read string), but after comparing it with the same expression written by hand with a lambda expression, I noticed the difference between the “AND” operator and the “&&” operator.

As it turns out, ExpressionType.Add is actually a bit-wise operator (similiar to &) and the enum that matches the && operator is the ExpressionType.AndAlso (the && operator is what is called a short-circut evaluator).

This is the same with the || (or) operator – the ExpressionType.Or is the bitwise or, whilst the ExpressionType.OrElse is the actual “||” operator.

I honestly think that it would have been better if they named this types as ExpressionType.BitwiseAnd and ExpressionType.And – makes more sense, doesn’t it?

So be careful the next time you want to use and/or in your expression tree.

Further links:

http://en.wikipedia.org/wiki/Short-circuit_evaluation

http://msdn.microsoft.com/en-us/library/bb353520.aspx

Comments

Shlomo said:

ב - vb.net יש את האופרטור And ו - AndAlso שזה בדיוק מה שתיארת כאן

# August 26, 2009 10:18 PM

עידו said:

בגלל זה עדיף שמות enum שלא יהיו מקובעים לשפה ספציפית, אלא יהיו מספיק ברורים.

אגב, אני מחכה לשמוע את ההרצאה שלך מחר, שיהיה בהצלחה.

# August 26, 2009 10:33 PM
Leave a Comment

(required) 

(required) 

(optional)

(required) 


Enter the numbers above: