【发布时间】:2016-09-07 18:01:03
【问题描述】:
我正在尝试使用CSharpSyntaxWalker 中的nameof 表达式做一些事情,但是,我注意到AST 中没有NameOfExpressionSyntax。相反,我得到了一个InvocationExpressionSyntax,其中SemanticModel.GetSymbolInfo 没有返回匹配的符号,并且调用的表达式是一个包含标识符标记"nameof" 的IdentifierNameSyntax。
所以要识别nameof 表达式,我会在VisitInvocationExpression 中添加一个特殊情况,查找GetSymbolInfo 是否返回任何内容,如果没有,则查找标识符是否为nameof。然而,这对我来说听起来有点不确定。有没有更好的方法可以将这种检测逻辑转移到解析器?
(P.S.:我知道这可能是出于向后兼容性的原因解析的;只是想知道是否有用于区分 nameof 和正常调用的 API。)
【问题讨论】:
-
仍然没有 c# 6 的正式规范,但 this draft 似乎确实确认它是一个模棱两可的解析,因此需要额外的推理。
-
@Damien_The_Unbeliever:我实际上尝试在 Roslyn 的源代码中找到它确定但无法粗略搜索的位置。也许我应该再看看。
-
不,照你的做。考虑到任何人都可以在 C# 6 之前拥有
nameof()方法,因此无法保证它不是引用类中的方法或通过static using导入的方法。在语法分析的时候还没有语义模型的概念,之后显然为时已晚。任何进行nameof解析的人都必须连接自己的解决方案;-)