如何解决Roslyn 使用 MemberAccessExpressionSyntax 而不是 QualifiedNameSyntax
在 following code 中,我希望对 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。
,我不能肯定地告诉你为什么,但这里有一件相关的事情需要考虑:
在法律代码中,我认为 switch 永远不能接受 MemberAccessExpression
是对的,因此 QualifiedNameSyntax
足以表示这一点。
不过,让我们看看一些非法代码,看看会发生什么:
class Foo
{
public static void M(object o)
{
var t = typeof(Foo.M(5)); // 1
switch(o)
{
case Foo.M(5): // 2
break;
}
}
}
第一次使用 Foo.M(5)
时会出现 4 个错误:
error CS1026: ) expected
error CS1002: ; expected
error CS1513: } expected
error CS0426: The type name 'M' does not exist in the type 'Foo'
第二个只有 1 个:
error CS0426: The type name 'M' does not exist in the type 'Foo'
通过在第二种情况下允许更灵活的语法,错误消息要好得多,因为它们可以在语义级别而不是语法级别完成。
由于 switch 表达式接受任何模式作为案例,因此您更有可能编写无效的内容,因此在这种情况下,好的错误消息更为重要。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。