C#规范7.16.2.5中的不一致

Raw*_*ing 13 c# linq-query-syntax language-lawyer roslyn

我正在Roslyn中实现C#规范7.16.2"查询表达式转换".但是,我在7.16.2.5"选择子句"中遇到了问题.

它读

表单的查询表达式

from x in e select v
Run Code Online (Sandbox Code Playgroud)

被翻译成

( e ) . Select ( x => v )
Run Code Online (Sandbox Code Playgroud)

除非v是标识符x,否则翻译很简单

( e )
Run Code Online (Sandbox Code Playgroud)

例如

from c in customers.Where(c => c.City == "London")
select c
Run Code Online (Sandbox Code Playgroud)

简单地翻译成

customers.Where(c => c.City == "London")
Run Code Online (Sandbox Code Playgroud)

我的代码不会产生与示例匹配的结果,因为(根据"除非"行),我将其翻译from x in e select x( e ),而不仅仅是e.因此,我的代码将示例翻译成

( customers.Where(c => c.City == "London") )
Run Code Online (Sandbox Code Playgroud)

规范中的示例是错误的,还是我需要进行处理以识别是否需要括起括号?如果是这样,这是在规范的某个地方吗?

同样,7.16.2.6(Groupby条款)说

表单的查询表达式

from x in e group v by k
Run Code Online (Sandbox Code Playgroud)

被翻译成

( e ) . GroupBy ( x => k , x => v )
Run Code Online (Sandbox Code Playgroud)

除非v是标识符x,否则翻译为

( e ) . GroupBy ( x => k )
Run Code Online (Sandbox Code Playgroud)

这个例子

from c in customers
group c.Name by c.Country
Run Code Online (Sandbox Code Playgroud)

被翻译成

customers.
GroupBy(c => c.Country, c => c.Name)
Run Code Online (Sandbox Code Playgroud)

在那里,示例结果再次缺少规范建议的括号.

Kri*_*ten 0

您的翻译加上附加的()是正确的。但如果你想消除多余的括号,你可以调用

.WithAdditionalAnnotations(CodeAnnotations.Simplify)
Run Code Online (Sandbox Code Playgroud)

关于你的结果SyntaxNode.