// Type patterns - Example 1 // C# 8 static int GetSpeed(Vehicle vehicle) => vehicle switch { Bus _ => 75, Car _ => 100, _ => 50 }; // C# 9 static int GetSpeed2(Vehicle vehicle) => vehicle switch { Bus => 75, Car => 100, _ => 50 }; // Type patterns - Example 2 // C# 8 static bool IsDannyTuple((object, object) tuple) { return tuple is (string _, int _); } // C# 9 static bool IsDannyTuple2((object, object) tuple) { return tuple is (string, int); } // Relational patterns - Example 1 // C# 8 static int GetTax(int muncipalityId) => muncipalityId switch { 0 => 20, int n when n < 5 => 21, int n when n <= 10 => 22, int n when n > 21 => 23, _ => 20 }; // C# 9 static int GetTax2(int muncipalityId) => muncipalityId switch { 0 => 20, < 5 => 21, <= 10 => 22, > 21 => 23, _ => 20 }; // Relational patterns - Example 2 // C# 8 bool IsLetter(char c) => c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'; // C# 9 bool IsLetter2(char c) => c is >= 'a' and <= 'z' or >= 'A' and <= 'Z'; // Logical patterns - Example 1 // C# 8 static int GetTax3(int muncipalityId) => muncipalityId switch { int n when n == 0 || n == 1 => 20, int n when n > 1 && n < 5 => 21, int n when n > 5 && n != 7 => 22, 7 => 23, _ => 20 }; // C# 9 static int GetTax4(int muncipalityId) => muncipalityId switch { 0 or 1 => 20, > 1 and < 5 => 21, > 5 and not 7 => 22, 7 => 23, _ => 20 }; // Logical patterns - Example 2 // C# 8 static int GetSpeed3(Vehicle vehicle) { if (!(vehicle is null)) { if (!(vehicle is Bus)) return 100; return 70; } return 0; } // C# 9 static int GetSpeed4(Vehicle vehicle) { if (vehicle is not null) { if (vehicle is not Bus) return 100; return 70; } return 0; } // Logical patterns - Example 3 // C# 8 static int GetSpeed5(Vehicle vehicle) => !(vehicle is Bus) ? 100 : 70; // C# 9 static int GetSpeed6(Vehicle vehicle) => vehicle is not Bus ? 100 : 70; // Parenthesized patterns // C# 9 bool IsLetter3(char c) => c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z');