首页 > 解决方案 > 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;
        }
    }
}

标签: roslync#-9.0

解决方案


通常,您只会在 Roslyn 语法树中获得 QualifiedNameSyntax,其中唯一合法的东西是限定名称;在这些情况下,我们正在运行一个只能理解限定名称的受限解析器。我们正在运行我们的通用表达式解析器的任何其他内容,它将吐出那里的任何表达式,我们将在绑定期间弄清楚它实际上是什么。因为考虑另一种情况,例如:

SomeEnum e;
switch (e)
{
     case SomeEnum.Blue: Console.WriteLine("Blue!"); return;
}

在这种情况下, SomeEnum.Blue 绝对是对成员的访问。但是在绑定之前我们实际上并不知道“SomeEnum”是什么,所以我们总是使用 MemberAccessExpression。


推荐阅读