3

这似乎是一个相当愚蠢的问题,我不确定它是否适合 StackOverflow。

我的工具的用户报告了消息错误

Unable to cast object of type
'Microsoft.CodeAnalysis.CSharp.Syntax.LiteralExpressionSyntax' to type
'Microsoft.CodeAnalysis.CSharp.Syntax.PatternSyntax'.

我不确切知道他的代码是什么样的(至少现在还没有)。如果我可以编写一些包含 PatternSyntax 的代码,我可能能够重现该错误。

我的问题是,我不知道 C# 中的哪种语言构造会生成 PatternSyntax 类型的语法节点。

有人可以帮我举个例子吗?

4

1 回答 1

2

我相信这是从Pattern Matching生成的语法的一部分。此功能的规范描述了语法以及更多示例。

PatternSyntax在这里定义:http: //sourceroslyn.io/Microsoft.CodeAnalysis.CSharp/Generated/Syntax.xml.Internal.Generated.cs.html#b554fa43e6090c28

以下继承自PatternSyntax

DiscardPatternSyntax
DeclarationPatternSyntax
VarPatternSyntax
RecursivePatternSyntax
ConstantPatternSyntax

我相信一个例子VarPatternSyntax如下var o

static object CreateShape(string shapeDescription)
{
    switch (shapeDescription)
    {
        case var o when (o?.Trim().Length ?? 0) == 0:
            // white space
            return null;
        default:
            return "invalid shape description";
    }            
}

我们可以将上面的代码输入RoslynQuoter以查看如何生成它,它看起来像:

CasePatternSwitchLabel(
            VarPattern(
                SingleVariableDesignation(
                    Identifier("o"))),
            Token(SyntaxKind.ColonToken))
        .WithWhenClause(
            WhenClause(
                BinaryExpression(
                    SyntaxKind.EqualsExpression,
                    ParenthesizedExpression(
                        BinaryExpression(
                            SyntaxKind.CoalesceExpression,
                            ConditionalAccessExpression(
                                IdentifierName("o"),
                                MemberAccessExpression(
                                    SyntaxKind.SimpleMemberAccessExpression,
                                    InvocationExpression(
                                        MemberBindingExpression(
                                            IdentifierName("Trim"))),
                                    IdentifierName("Length"))),
                            LiteralExpression(
                                SyntaxKind.NumericLiteralExpression,
                                Literal(0)))),
                    LiteralExpression(
                        SyntaxKind.NumericLiteralExpression,
                        Literal(0)))))))
于 2019-10-20T21:59:32.117 回答