The previous article in our C# 9 series looked at top-level programs and target-typed expressions. In this article, we’ll cover new features for pattern matching. You can find an overview of the syntax offered by previous versions of C# in C# 8 pattern matching.
Type patterns
When checking against a type, previous versions of C# required you to include a variable name (or a _
discard). This is no longer required with C# 9:
// is pattern with Type if (input is Person) ... // case pattern with Type switch (input) { case Person: ... // is pattern with tuple Type if (input is (int, string)) ...
Combining patterns
With the is
expression in earlier versions of C#, you could already combine patterns using regular logical operators:
if (person is Student || person is Teacher) ...
However, this doesn’t work for switch
expressions and switch
case
labels. C# 9 adds support for combining patterns using the and
and or
keywords, which works for both if
and switch
:
if (person is Student or Teacher) ... decimal discount = person switch { Student or Teacher => 0.1m, _ => 0 }; switch (person) { case Student or Teacher: ...
The and
patterns have higher precedence than the or
patterns. You can add parentheses to change or clarify the precedence.
Inverting patterns
With C# 9, you can invert patterns using the not
keyword:
if (person is not Student) ... switch (person) { case not Student: ...
An interesting case is the is not null
pattern. This will check whether the reference is not null. Using != null
may check something different when the type overloads the !=
operator.
if (person is not null) ...
Relational patterns
Relational patterns allow you to compare an expression to a constant numeric value:
decimal discount = age switch { <= 2 => 1, < 6 => 0.5m, < 10 => 0.2m, _ => 0 };
Patterns within patterns
Patterns can also contain other patterns. This nesting lets you express complex conditions in a concise and readable way. The following example combines several types of patterns:
if (person is Student { Age : >20 and <30 }) ...
Conclusion
In this article, we looked at the new pattern matching features in C# 9. The additions allow you to express more complex conditions with a clear, concise syntax.
In the next article, we'll explore new features for methods and functions in C# 9.
C# 9 can be used with the .NET 5 SDK, which is available on Red Hat Enterprise Linux and Red Hat OpenShift, on Fedora, and from Microsoft for Windows, macOS, and other Linux distributions.
Last updated: April 21, 2021