2010-10-20 2 views
0

лямбда обозначенияЛямбда обозначения и логические сравнения

x => x.MyProperty 

легко спутать, некоторые люди, с больше или равно. Т.е.

if (x => y) ... 

вопрос: компилятор когда-либо путает их? То есть, если один принять конвенцию в результате чего больше или равно всегда кодируется как:

if (x >= y) ... 

Я предполагаю, что компилятор может различать два на основе контекста, но что было бы «лучшей практики»?

вопрос о SO

ASP.NET MVC2 Checkboxes in a table

рода показали, что легко получить это неправильно.

EDIT:

В свете крошечного шторма, который заваривается над этим, следующее может прояснить.

Я задал вопрос, потому что я ответил на вопрос, когда парень ошибся в лямбда-нотации. Я указал на его опечатку, и он принял мой ответ. Существует ссылка на вопрос выше.

Вопрос тогда меня обманул. Я всегда использовал> = по какой-то очень веской причине, но был убежден, что видел код, который использовал другую нотацию. Иногда у вас есть предположения, что вы не думаете о допросе. Это может быть из моих дней VBA или нет, но убеждение остается в том, что я видел код, который компилируется, запускается и использует => для большего, чем сравнение. Быть по сему. Приношу свои извинения за то, что я не стрелял в VS, но я весь день работал с Sitefinity в офисе без установки VS. Никакого оправдания, я вам даю.

Но обратите внимание, что лямбда-выражения в C# являются только старыми, как ... .NET 2? или это был .NET 3.5. Учитывая, что я использовал C# с версии с версии 1.0, вопрос неправильный, но не тот абсурд.

Я также считаю, что жесткие правила SO велики в том, что они производят нетронутый Q & A. Но существуют разные способы применения правил. Я только с самого начала использую SO всерьез с середины сентября, поэтому считаю, что лучше всего выстрелить в предупреждающий выстрел по плохим вопросам, а не подергивать колпачок при первой возможности. Это то, что SO поощряет: оставить комментарий, а не просто вызвать счастливую маркировку. Вы даете ответчику возможность реализовать свою ошибку и удалить бессмысленный вопрос из системы. Потому что, как только ответы и голоса наводняются, вопрос не может быть удален апеллятором.

Конец напева.

+1

Интересный вопрос, хотя на практике я никогда не видел, чтобы кто-либо пытался использовать => в качестве оператора сравнения. Кроме того, в соответствии с условностями каждая книга, которую я имею в программировании, представляет логический оператор сравнения GREATER THAN как '> =' –

+0

Почему люди путают этот вопрос? Хорошее горе ... У ОП есть разумная точка зрения о человеческом замешательстве. И ошибиться в том, что действительно синтаксис C# не делает вопрос плохой ИМО. Это возможность учиться. – LarsH

+1

@LarsH: Потому что вопрос не имеет смысла. => не может использоваться для сравнения равенства, он не будет компилироваться. Кроме того, предполагая, что компилятор смущает эти два, это немного абсурдная ИМО. – BFree

ответ

15

if (x => y) является неверным кодом.

Операторы сравнения (x >= y и x <= y) должны иметь знак <> перед знаком =.

Таким образом, компилятор (или человек, ориентированный на детали) не может смутить их.

+2

Совершенно верно * синтаксис *. Ошибка возникает во время семантического анализа, а не синтаксического или лексического анализа, поскольку выражение лямбда не может быть преобразовано в bool. –

+0

@ Эрик: Мне было интересно об этом; Благодарю. – SLaks

+0

Я подозреваю, что мое заблуждение исходит из того, что я начал с MS Access. Я протестировал это предположение с Access 2007, и он не жалуется, он просто автоматически переписывает символы. Ie, => становится> =. Не так уверен в Access 200x. Я почти уверен, что видел код VBA в работающих приложениях, которые не делают различий. Возможно, мне следовало бы запустить VS для тестирования ... – awrigley

3

=> является лямбда-оператору

терки или равно является> =

Я не думаю, что его можно спутать, потому что они не являются взаимозаменяемыми

3

Разве компилятор когда-либо путает их?

№ В C# (я смотрю на бирку) >= всегда сравнивается; => всегда является выражением лямбда. Существует no => comparison operator in C#.

Я предполагаю, что компилятор может различать между ними на основе контекста

компилятор не нуждается в контексте, чтобы отличить два; см. выше.

Т.е., если один принять конвенцию которой больше или равно это всегда кодируется как:

, если (х> = у) ...

Да, потому, что это единственный способ, который компилятор примет. :-)

Что касается человеческой ошибки, я думаю следующее мнемоклавиши помощь:

  • Мы почти всегда говорят «больше или равно» в отличие от «равно или больше, чем».
  • Математические символы помещают «больше» или «меньше» над линией, которая символизирует «или равна». Естественно, это можно перевести в порядок слева направо.
  • Символ, используемый для выражения лямбда в C#, выглядит как стрелка, указывающая на выражение для возвращаемого значения. Его можно рассматривать как «урожайность».
Смежные вопросы