繁体   English   中英

C# Roslyn 编译器语法种类值关键字

[英]C# Roslyn Compiler Syntaxkind Value Keyword

我目前正在使用来自 Roslyn 的语法 API 来生成一些 C# 代码,并且在定义这样的集合访问器时我想知道一件小事:

var setAccessor = AccessorDeclaration(SyntaxKind.SetAccessorDeclaration)
.AddBodyStatements(ExpressionStatement(InvocationExpression(IdentifierName("SetField"))
.AddArgumentListArguments(Argument(IdentifierName("value")))));
var propertyDeclaration = PropertyDeclaration(ParseTypeName("FieldType"), "Field")
                .AddModifiers(Token(SyntaxKind.PublicKeyword))
                .AddAccessorListAccessors(setAccessor);

效果很好。 我对 setAccessor 中的value关键字有点困惑,因为通常我希望能够像这样声明它:

IdentifierName(Token(SyntaxKind.ValueKeyWord))

但据我所见,没有SyntaxKind.ValueKeyword ,我是遗漏了什么还是这里有什么问题?

value是一个特殊的上下文关键字。

在属性和索引器声明中的set访问器中使用上下文关键字value 它类似于方法的输入参数。

C# 标准规范说:

以下标识符在句法语法中具有特殊含义,但它们不是关键字:add(§17.7)、alias(§16.3)、get(§17.6.2)、global(§16.7)、partial(§17.1.4) ,删除(§17.7),设置(§17.6.2),值(§17.6.2,§17.7.2),其中(§25.7)和产量(§15.14)。 为了方便和清楚起见,这些标识符在句法语法中显示为终结符; 但是,它们是标识符。 [注意:因此,与关键字不同,这些标识符可以使用@前缀编写,并且可以包含 unicode-escape-sequences。 尾注]

换句话说,语法 model 将所有上下文关键字视为标识符,而不是常规关键字。 一些上下文关键字(如yield )确实出现在SyntaxKind中,但其他关键字(如varvalue没有)。

此 github 问题包括一些相关讨论,包括:

它是上下文关键字,但不是关键字 Roslyn 的语法 model 仅包含对上下文是语法的上下文关键字的显式支持。 这就是为什么语法 model 没有告诉你上下文关键字varvalue的原因。 在任何情况下,所有上下文关键字都是标识符。

这个 SO question是相关的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM