Roslyn 使用 MemberAccessExpressionSyntax 而不是 QualifiedNameSyntax

Vag*_*aus 1 roslyn c#-9.0

下面的代码中,我希望对System.Action类型的两个引用都表示为QualifiedNameSyntax,但第二个引用表示为MemberAccessExpressionSyntax

那是对的吗?如果是这样,为什么不能是 a QualifiedNameSyntax

class Foo
{
    public void M(object o)
    {
        var t = typeof(System.Action); // 1
        switch(o)
        {
            case System.Action: // 2
                break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jas*_*ski 6

一般来说,您只会在 Roslyn 语法树中获得 QualifiedNameSyntax,其中唯一合法的东西是限定名称;在这些情况下,我们运行一个受限的解析器,它只能理解限定名称。我们正在运行通用表达式解析器,它将吐出其中的任何表达式,并且我们将在绑定过程中找出它实际上是什么。因为考虑另一种情况,例如:

SomeEnum e;
switch (e)
{
     case SomeEnum.Blue: Console.WriteLine("Blue!"); return;
}
Run Code Online (Sandbox Code Playgroud)

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