views:

156

answers:

3

The lambda notation

x => x.MyProperty

is easily confused, by some humans, with greater than or equal to. Ie

if (x => y) ...

the question is: Does the compiler ever confuse these? Ie, should one adopt a convention whereby greater than or equal to is always coded as:

if (x >= y) ...

I guess the compiler can distinguish between the two based on context, but what would be the "best practice"?

A question on SO

http://stackoverflow.com/questions/3966823/asp-net-mvc2-checkboxes-in-a-table/3966852#3966852

sort of showed that it is easy to get it wrong.

EDIT:

In light of the wee storm that has brewed up over this one, the following may clarify.

I asked the question because I answered a question where the guy had mistyped the lambda notation. I pointed out his typo and he accepted my answer. There is a link to the question above.

The question then niggled me. I have always used >= for no very good reason, but was convinced that I had seen code that used the other notation. Sometimes, you have assumptions that you don't think of questioning. It may well be from my VBA days or not, but the conviction remains that I have seen code that compiles, runs and that uses => for the greater than comparison. So be it. My apologies for not "firing up VS", but I had been working all day with Sitefinity in an office with no VS installation. No excuse, I grant you.

But note that lambda expressions in C# are only as old as... .NET 2? or was it .NET 3.5. Given that I have used C# on and off since version 1.0, the question is wrong, but not that absurd.

I also think that the rigid rules of SO are great in that they produce pristine Q&A. But there are different ways of applying the rules. I have only been using SO in earnest since mid September, so I think it is best to fire a warning shot at bad questions rather than jerking the knee cap at the first opportunity. That is what SO encourages: to leave a comment rather than just trigger happy marking down. You give the asker the chance to realise their mistake and delete a pointless question from the system. Because once the answers and the votes flood in, the question cannot be deleted by the asker.

End of rant.

+3  A: 

=> is lambda operator

grater or equal is >=

I dont think that it can be confused, because they are not interchangeable

Markos
+13  A: 

if (x => y) is invalid code.

The comparison operators (x >= y and x <= y) must have the <> before the = sign.

Thus, it is not possible for the compiler (or a detail-oriented human) to confuse them.

SLaks
It is perfectly valid *syntax*. The error occurs during semantic analysis, not syntactic or lexical analysis, because the lambda expression cannot be converted to bool.
Eric Lippert
@Eric: I was wondering about that; thanks.
SLaks
I suspect my misconception comes from the fact that I started with MS Access. I have tested this assumption with Access 2007 and it doesn't complain, it just auto realigns the characters. Ie, => becomes >=. Not so sure about Access 200x. I'm pretty sure I have seen VBA code in working apps that make no distinction. Maybe I should have fired up VS to test...
awrigley
Eric: so was this error raised in the not so distant days before lambda expressions?
awrigley
@awrigley: Of course. Back then, it was invalid syntax.
SLaks
+3  A: 

Does the compiler ever confuse these?

No. In C# (I'm looking at the tag) >= is always comparison; => is always a lambda expression. There is no => comparison operator in C#.

I guess the compiler can distinguish between the two based on context

The compiler doesn't need context to distinguish the two; see above.

Ie, should one adopt a convention whereby greater than or equal to is always coded as:

if (x >= y) ...

Yes, because that is the only way the compiler will accept it. :-)

Regarding human error, I think the following mnemonics help:

  • We almost always say "greater than or equal to" as opposed to "equal to or greater than".
  • Math symbols put the "greater than" or "less than" above the line that symbolizes "or equals". This can translate into a left-to-right order pretty naturally.
  • The symbol used for a lambda expression in C# looks like an arrow, pointing toward the expression for the returned value. It can be thought of as "yields".
LarsH