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

Обозначение лямбда

x => x.MyProperty

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

if (x => y) ...

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

if (x >= y) ...

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

Вопрос по СО

Флажки ASP.NET MVC2 в таблице

вроде показал, что легко ошибиться.

РЕДАКТИРОВАТЬ:

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

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

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

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

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

Конец разглагольствования.


person awrigley    schedule 20.10.2010    source источник
comment
Интересный вопрос, хотя на практике я никогда не видел, чтобы кто-то пытался использовать =› в качестве оператора сравнения. Кроме того, по соглашению, в каждой книге по программированию, которой я владею, логический оператор сравнения БОЛЬШЕ ЧЕМ представлен как '›='   -  person Brian Driscoll    schedule 20.10.2010
comment
Почему люди минусуют этот вопрос? Боже мой ... У ОП есть разумное мнение о человеческом замешательстве. И ошибиться в том, что является допустимым синтаксисом С#, не делает вопрос плохим IMO. Это возможность учиться.   -  person LarsH    schedule 20.10.2010
comment
@LarsH: Потому что вопрос не имеет смысла. =› нельзя использовать для сравнения на равенство, это не скомпилируется. Кроме того, предположение, что компилятор путает их, немного абсурдно, ИМО.   -  person BFree    schedule 20.10.2010
comment
@BFree: вопрос имеет смысл, исходя из ошибочного предположения ОП о том, что =› и ›= можно использовать для сравнения. Как и предположение, что компилятору нужен контекст, чтобы различать их. ИМО, выявление значительного ошибочного предположения и его исправление почти так же полезно, как задать вопрос (без ошибочных предположений) и получить на него ответ. Нет смысла наказывать людей за честные и четкие вопросы. Вы не знаете, чего вы не знаете, пока не спросите.   -  person LarsH    schedule 20.10.2010
comment
@LarsH: Прежде чем задавать подобный вопрос, самое лучшее, что вы можете сделать, это запустить Visual Studio и проверить, чтобы убедиться, что то, что вы заявляете как факт, на самом деле является точным.   -  person BFree    schedule 20.10.2010
comment
@Brian, @LarsH, @BFree: LarsH прав, и вопрос вовсе не абсурден. Есть популярные языки, в которых ›= и =› имеют одинаковую семантику. Сразу приходит на ум VBScript. VB IDE автоматически исправит =› на ›=, но если вы переопределите автозамену и заставите ее компилироваться с =›, тогда компиляция все равно будет успешной.   -  person Eric Lippert    schedule 20.10.2010
comment
@LarsH: В свете того, что указал Эрик, я исправляюсь. Удалил мой -1.   -  person BFree    schedule 20.10.2010
comment
@Brian, @BFree: спасибо. При дальнейшем размышлении я понимаю, что грань между голосованием за кого-то, потому что они говорят вводящие в заблуждение и неправильные слова о предмете, который они комментируют (наиболее подходит для ответов, где кто-то утверждает, что он хорошо осведомлен), и голосованием за кого-то вниз, потому что они не знают, что их предположения неверны, когда задают вопрос, несколько субъективно. Но я думаю, что есть стоящая разница.   -  person LarsH    schedule 20.10.2010


Ответы (3)


if (x => y) неверный код.

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

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

person SLaks    schedule 20.10.2010
comment
Это совершенно корректный синтаксис. Ошибка возникает во время семантического анализа, а не синтаксического или лексического анализа, поскольку лямбда-выражение не может быть преобразовано в логическое значение. - person Eric Lippert; 20.10.2010
comment
Я подозреваю, что мое неправильное представление связано с тем, что я начал с MS Access. Я проверил это предположение с помощью Access 2007, и он не жалуется, он просто автоматически перестраивает символы. То есть =› становится ›=. Не уверен в Access 200x. Я почти уверен, что видел код VBA в рабочих приложениях, которые не делают различий. Может быть, я должен был запустить VS для проверки... - person awrigley; 20.10.2010
comment
Эрик: так эта ошибка возникала не так давно, до появления лямбда-выражений? - person awrigley; 20.10.2010

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

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

Не думаю, что это можно перепутать, потому что они не взаимозаменяемы.

person Markos    schedule 20.10.2010

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

Нет. В C# (я смотрю на тег) >= всегда сравнение; => всегда является лямбда-выражением. В C# нет => оператора сравнения.

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

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

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

if (x >= y) ...

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

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

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