簡體   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