8

C#7 introduces a new feature called patterns, which you can use with Is-Expression or Switch cases like this:

string str = null; 
switch(str){
    case string x:
        Console.WriteLine("string " + x);
        break;
    default:
        Console.WriteLine("default");
        break;
}

and you would expect that it will goes inside case #1, as it is the same type, but it didn't.

MAbdulHalim
  • 389
  • 4
  • 14

2 Answers2

16

Despite what you might think, string x = null actually isn't a string at all. It is 'nothing', assigned to a variable of type string.

The check in your switch is basically the same as null is string which is false for a long time already. This is a common issue when evaluating types with generics, but it has its plus sides too.

Under the hood, is uses as, with a null check. So that is why it can't return true. You could say the logic for the is operator is as follows:

is = (null as string) != null
Patrick Hofman
  • 153,850
  • 22
  • 249
  • 325
0

actually they are not because of the null on string.

the idea is that switch cases with patterns in c#7 adds another case for Null checking while evaluating the cases, and if you didn't add your Null case check, it will go to default case, so it is better to add a null case while using this new feature, or leave it to default if you know what default will do.

Hope it helps!

MAbdulHalim
  • 389
  • 4
  • 14
  • 2
    No, that is not the idea behind it. The thing is just how .NET works under the hood. See my answer which explains how this pattern is implemented. – Patrick Hofman Mar 22 '17 at 11:59