C#7使用空检查切换案例

MAb*_*lim 7 c# pattern-matching switch-statement null-string c#-7.0

C#7引入了一个名为patterns的新功能,您可以将其与Is-Expression或Switch案例一起使用,如下所示:

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

并且你会期望它会进入#1的情况,因为它是相同的类型,但它没有.

Pat*_*man 14

尽管你可能会想到,string x = null实际上根本不是一个字符串.它是'无',分配给string类型的变量.

在开关的检查是基本相同,null is string这是false很长一段时间了.在使用泛型评估类型时,这是一个常见问题,但它也有优势.

在引擎盖下,is使用as,使用空检查.所以这就是它无法返回真实的原因.你可以说is运算符的逻辑如下:

is = (null as string) != null
Run Code Online (Sandbox Code Playgroud)


MAb*_*lim 0

实际上它们不是因为字符串上的空值。

这个想法是, c#7 中带有模式的switch case 在评估案例时添加了另一个用于 Null 检查的案例,如果您没有添加 Null 案例检查,它将转到默认情况,因此最好添加一个 null使用此新功能时的情况,或者如果您知道默认值会做什么,请将其保留为默认值。

希望能帮助到你!

  • 不,这不是其背后的想法。问题在于 .NET 的底层工作原理。请参阅我的答案,它解释了如何实现此模式。 (2认同)