Я занимаюсь реализацией спецификации C# 7.16.2 «Перевод выражения запроса» в Roslyn. Однако я столкнулся с проблемой в 7.16.2.5 «Выбор предложений».Несоответствие в спецификации C# 7.16.2.5
Он читает
выражение запроса вида
from x in e select v
переводится на
(e) . Select (x => v)
исключением случаев, когда v является идентификатором х, перевод просто
(e)
Например
from c in customers.Where(c => c.City == "London") select c
просто переводится в
customers.Where(c => c.City == "London")
Мой код не дает результата, соответствующий пример, потому что (как на линии «кроме случаев, когда») я перевожу from x in e select x
в (e)
, а не только e
. Таким образом, мой код переводит пример в
(customers.Where(c => c.City == "London"))
Является примером в спецификации не так, или мне нужно делать обработку признать, необходимы ли вмещающие скобки? Если да, это где-то в спецификации?
Аналогично, 7.16.2.6 (GroupBy положения) говорит
Выражение запроса формы
from x in e group v by k
переводится в
(e) . GroupBy (x => k , x => v)
исключением случаев, когда v является идентификатором х , перевод
(e) . GroupBy (x => k)
Пример
from c in customers group c.Name by c.Country
переводится в
customers. GroupBy(c => c.Country, c => c.Name)
где снова пример результата не хватает скобки, предложенные в спецификации.
Я думаю, что в скобках указано, что 'e' оценивается первым и выбирает, группируя, как применяется позже. В примере используется набор «клиентов», где клиенты такие же, как «(клиенты)», но представьте, что у вас есть оператор +, используемый для конкатенации двух списков - 'from x in a + b' должен быть переведен в' (a + б) .Where'. Я предполагаю, что() является правильным, и пример является только упрощенной версией того же (для этого конкретного случая) – Ondra
@Ondra Да, я понял, что именно поэтому скобки есть (и спасибо за хороший пример того, где он сломается без них!). Меня просто беспокоит, потому что, поскольку примеры в спецификации упрощены, мне интересно, нужно ли мне выяснить, как сделать мою собственную реализацию, выполнить такое же упрощение. – Rawling
@ Rawling Зачем вам это нужно? Код с круглыми скобками всегда будет правильным. – svick