c# - 什么是 Roslyn 中的 PatternSyntax

标签 c# roslyn visual-studio-extensions microsoft.codeanalysis

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

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

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

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

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

有人能帮我举个例子吗?

最佳答案

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

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)))))))

关于c# - 什么是 Roslyn 中的 PatternSyntax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58476032/

相关文章:

visual-studio - 在代码中调用 VS2012 解决方案资源管理器命令

c# - 将鼠标侧键绑定(bind)到 VisualStudio 操作

c# - HttpWebRequest 和 WebResponse.GetResponse 给出不完整的响应

c# - 每当属性的值发生变化时引发事件?

c# - 在 Roslyn 中编辑循环

c# - SyntaxWalker 访问者不访问方法

c# - 如何使用 Roslyn 查找变量以前的用法?

c# - 为什么修改本地数据时yield return不起作用?

c# - .net 4.0 并发队列字典

C# VSTO Excel 自动筛选值和空白