roslyn - Roslyn 使用 MemberAccessExpressionSyntax 而不是 QualifiedNameSyntax
问题描述
在下面的代码中,我希望对System.Action
类型的两个引用都表示为QualifiedNameSyntax,但第二个引用表示为MemberAccessExpressionSyntax。
那是对的吗?如果是这样,为什么不能是一个QualifiedNameSyntax
?
class Foo
{
public void M(object o)
{
var t = typeof(System.Action); // 1
switch(o)
{
case System.Action: // 2
break;
}
}
}
解决方案
通常,您只会在 Roslyn 语法树中获得 QualifiedNameSyntax,其中唯一合法的东西是限定名称;在这些情况下,我们正在运行一个只能理解限定名称的受限解析器。我们正在运行我们的通用表达式解析器的任何其他内容,它将吐出那里的任何表达式,我们将在绑定期间弄清楚它实际上是什么。因为考虑另一种情况,例如:
SomeEnum e;
switch (e)
{
case SomeEnum.Blue: Console.WriteLine("Blue!"); return;
}
在这种情况下, SomeEnum.Blue 绝对是对成员的访问。但是在绑定之前我们实际上并不知道“SomeEnum”是什么,所以我们总是使用 MemberAccessExpression。
推荐阅读
- r - 重构R中的观察
- java - Spring 控制器处理程序方法中未注释参数的目的是什么?
- python - libgdal.so.20:未定义的符号
- loops - 如何为库中的所有数据集运行代码(宏?)?
- pandas - 为什么要更改熊猫数据框的索引名称?
- ruby - Sinatra 呈现 .md.erb 模板(如果存在),否则呈现 .md
- scala - 如何打印spark rdd struct数据并保存到本地文件
- r - 使用基于当前年份的动态名称系列复制列
- amazon-web-services - 我可以多分区 s3
- ruby - Ruby 反斜杠转义:' \\ \hline' 作为字符串