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