这似乎是一个相当愚蠢的问题,我不确定它是否适合 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/