10

C# 9: Range Operators in Switch Constructs and Pattern Matching Expressions

 3 years ago
source link: https://www.infoq.com/news/2020/07/CSharp-9-Range-Patterns/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Since C# was first introduced, developers have complained about the lack of a range operator in switch constructs. This made switches far less useful in C# than they were in VB. As part of the pattern matching enhancements for C# 9 , this limitation has been addressed.

In this feature, the following patterns will be allowed following the case or is keyword.

  • < constant-expression
  • constant-expression
  • <= constant-expression
  • >= constant-expression
  • constant-expression to constant-expression

This is still more limited than VB in the sense that only constants are allowed. This becomes a problem when you are dealing with dates, times, or other comparable structs, as they do not have a constant representation in C#. (Date/time values can be expressed as a constant in VB, but it is discouraged because one runs into DateTime.Kind issues.) When asked why, Neal Gafter wrote ,

It doesn't do the same thing that pattern-matching was designed to do. Specifically, it was designed to work with constants specifically so that the compiler can analyze, diagnose, and optimize the totality of the set of pattern-matching operations. If the compiler doesn't know the value it is matching against, it cannot do any of that. That's not to say it is necessarily a bad idea, but it is a pretty different animal. Do ordinary expressions not satisfy that need?

Mariusz Pawelski explains why this may be a problem,

I just think there will be many people who will see using is and or keywords as just a different way of writing boolean expressions. Just another small C# feature that makes code more succinct. Similar to tons of other we got in recent years ( expression-bodied members, out variables, tuples, null-conditional operators operator, "default" literal, etc). They won't know it's part of greater feature like "pattern-matching" which "was designed to work with constants". They will just be confused when instead of constant they will use variable name and get "CS0150: A constant value is expected" error.

In our previous article, we discussed the and, or, and not pattern matching operators . These can be used in conjunction with ranges. For example,

bool IsLetter(char c) => c is >= 'a' and <= 'z' or >= 'A' and <= 'Z';

Admittedly, this is a bit difficult to read. So, another feature included in C# 9 is the ability to use parenthesis around patterns just as you would for other types of expressions to make the precedence explicit.

bool IsLetter(char c) => c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z');

This can be further simplified using inclusive ranges ( to ):

bool IsLetter(char c) => c is ('a' to 'z') or ('A' to 'Z');

According to the C# 9 feature status , these features are marked as having been merged into the master branch.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK