C# 为什么可以';如果初始化为null,我不能获取所有ObjectCreationExpressionSyntax吗?
因此,我有一个MethodDeclarationSyntax节点,我正在将其传递给CSharpSyntaxWalker,具有以下覆盖C# 为什么可以';如果初始化为null,我不能获取所有ObjectCreationExpressionSyntax吗?,c#,roslyn,microsoft.codeanalysis,C#,Roslyn,Microsoft.codeanalysis,因此,我有一个MethodDeclarationSyntax节点,我正在将其传递给CSharpSyntaxWalker,具有以下覆盖 public override void VisitObjectCreationExpression(ObjectCreationExpressionSyntax node) { LiteralExpressionCollector literalCollector = new LiteralExpressionCollec
public override void VisitObjectCreationExpression(ObjectCreationExpressionSyntax node)
{
LiteralExpressionCollector literalCollector = new LiteralExpressionCollector();
literalCollector.Visit(node.ArgumentList);
if (literalCollector.Literals.Count > 0)
Creations.Add(node, literalCollector.Literals);
}
public override void VisitAssignmentExpression(AssignmentExpressionSyntax node)
{
LiteralExpressionCollector literalCollector = new LiteralExpressionCollector();
var assigment = node.ChildNodes().FirstOrDefault(l => l is LiteralExpressionSyntax);
if(assigment != null)
literalCollector.Visit(assigment);
if (literalCollector.Literals.Count > 0)
Assigments.Add(node, literalCollector.Literals);
}
它以以下形式捕获所有ObjectCreationExpressionSyntax:
ResolveBomForMaterialInput rbfmiInput = new ResolveBomForMaterialInput()
但不包括以下内容:
FlowStructureScenario flowScenario = null;
flowScenario = new FlowStructureScenario("F", "F:3");
你知道为什么会这样吗?我认为这无关紧要,但我使用SyntaxWalkerDepth.Token作为深度
当前使用的版本为:Microsoft.CodeAnalysis1.3.2问题在于,您在
VisitAsignmentExpression
中的代码遇到赋值表达式时,会立即停止语法遍历。如果要继续遍历其子节点,可以添加base.visitaSignmentExpression(节点)编码>到方法。如果您还没有尝试,它包括一个扩展,可以让您查看解析树结构。感谢Jason,这确实是一个有用的扩展。您完全正确,这就是发生的情况。我真的不明白为什么第二个案例被认为是不合格的,如果第一个不是。是否因为变量已声明,且名称前没有类型?感谢Jason Malinkwski提到的语法可视化工具在这里变得有用。使用它,您可以看到第一种情况是LocalDeclarationStatement
包含VariableDeclaration
包含一个VariableDeclarator
,而第二种情况是ExpressionStatement
包含SimpleAssignmentExpression
。明白了!谢谢