gpt4 book ai didi

c# - C# 规范 7.16.2.5 中的不一致

转载 作者:可可西里 更新时间:2023-11-01 08:13:00 25 4
gpt4 key购买 nike

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

它是这样写的

A query expression of the form

from x in e select v

is translated into

( e ) . Select ( x => v )

except when v is the identifier x, the translation is simply

( e )

For example

from c in customers.Where(c => c.City == "London")
select c

is simply translated into

customers.Where(c => c.City == "London")

我的代码没有产生与示例匹配的结果,因为(根据“except when”行)我将 from x in e select x 翻译成 ( e ),而不仅仅是 e。因此我的代码将示例翻译成

( customers.Where(c => c.City == "London") )

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

同样,7.16.2.6(Groupby 子句)说

A query expression of the form

from x in e group v by k

is translated into

( e ) . GroupBy ( x => k , x => v )

except when v is the identifier x, the translation is

( e ) . GroupBy ( x => k )

The example

from c in customers
group c.Name by c.Country

is translated into

customers.
GroupBy(c => c.Country, c => c.Name)

示例结果再次缺少规范建议的括号。

最佳答案

在示例中,结构“e”是一个表达式,结构“( e )”表示一个主结构。也就是说,在 C# 语法中有一个产生式允许在任何需要主元素的地方使用“( e )”。还有一种产生式允许在任何需要表达式的地方使用主符号。

在“from”代码片段中,表达式“e”是必需的(根据 C# 语法),而在“Select()”片段中,主代码片段是必需的,此处表示为“( e )”。

示例的作者(也许不明智)选择了主要的“客户”而不是表达方式来说明这一点。如果该示例使用了一个表达式,那么翻译将包含括号。这个例子是正确的,但有点误导。

在回答您的问题时,您可以通过识别您是在处理基本表达式还是表达式来识别括号是否必要。对于小学,他们不是。

披露:我的专长是编译器技术、C# 语法和 Reflection.Emit,但(还)不是 Roslyn。我找不到任何在线文档,所以我无法告诉您如何在 Roslyn 中执行此操作。

关于c# - C# 规范 7.16.2.5 中的不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19876866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com