Я считаю, что это часть синтаксиса, сгенерированного из Pattern Matching . spec для этой функции описывает грамматику вместе с некоторыми другими примерами.
PatternSyntax
определено здесь: http://source.roslyn.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)))))))