标准C#分析中VariableDeclarator可否不隶属于VariableDeclaration存在?
C#语法树节点从属关系答疑
针对VariableDeclarator与VariableDeclaration的从属关系问题,结论如下:
- 该从属关系并非始终成立,在符合C#语法规范的场景下,确实存在
VariableDeclarator不属于VariableDeclaration成员的合法情况。
合法例外场景
1. foreach循环变量声明
foreach语句的循环变量对应的VariableDeclarator直接挂载在ForEachStatementSyntax节点下,无外层VariableDeclaration包裹。
示例代码:
foreach (var item in numList) {}
上述代码中item对应的VariableDeclarator父节点为ForEachStatementSyntax。
2. 内联out变量声明(C# 7.0及以上版本)
方法调用时内联声明的out变量,其VariableDeclarator直接属于DeclarationExpressionSyntax节点,不存在上层VariableDeclaration。
示例代码:
int.TryParse(inputStr, out var res);
代码中res对应的VariableDeclarator父节点为DeclarationExpressionSyntax。
3. 模式匹配中的声明模式
使用is关键字做类型匹配时声明的接收变量,其VariableDeclarator挂载在DeclarationPatternSyntax节点下,不属于VariableDeclaration的成员。
示例代码:
if (input is string strVal) {}
代码中strVal对应的VariableDeclarator父节点为DeclarationPatternSyntax。
4. 隐式类型using语句单变量声明(C# 8.0及以上版本)
省略大括号的隐式类型using声明场景中,变量对应的VariableDeclarator直接挂载在LocalDeclarationStatementSyntax的特殊分支下,部分解析版本中无外层VariableDeclaration包裹。
示例代码:
using var fs = new FileStream(path, FileMode.Open);
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

