带有空检查的 C# 7 switch case

Posted

技术标签:

【中文标题】带有空检查的 C# 7 switch case【英文标题】:C# 7 switch case with null checks 【发布时间】:2017-08-14 12:27:36 【问题描述】:

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

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

你会认为它会进入案例#1,因为它是相同的类型,但它没有。

【问题讨论】:

“因为它是同一类型” - 不是真的。如果你这样做object o = str; bool isString = o is string; 那么isString 将是错误的...... 是的,正确,空字符串不引用 System.String 对象 @JonSkeet,如果您在下面看到我的回答并查看它,我将不胜感激。 Patrick 的回答绝对是一个更好的 IMO。 【参考方案1】:

不管你怎么想,string x = null 实际上根本不是一个字符串。它是“无”,分配给字符串类型的变量。

你的switch里的check基本和null is string一样,早就是false了。这是使用泛型评估类型时的常见问题,但它也有其优点。

在后台,is 使用 as,并带有一个空检查。所以这就是为什么它不能返回真。您可以说is 运算符的逻辑如下:

is = (null as string) != null

【讨论】:

谢谢@patrick-hofman 还有如果我没有提供一个空案例的概念。这是正确的吗? 是的。这是唯一的选择。【参考方案2】:

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

这个想法是 switch 在 c#7 中带有模式的案例在评估案例时添加了另一个用于 Null 检查的案例,如果您没有添加 Null 案例检查,它将转到 default 大小写,所以最好在使用这个新功能时添加一个空大小写,或者如果你知道默认值会做什么,则将其保留为默认值。

希望对你有帮助!

【讨论】:

不,这不是它背后的想法。问题就是 .NET 在底层是如何工作的。请参阅我的回答,其中解释了这种模式是如何实现的。

以上是关于带有空检查的 C# 7 switch case的主要内容,如果未能解决你的问题,请参考以下文章

使用 switch-case 检查 Number / NaN 类型 [重复]

GCC 4.4:避免在 gcc 中对 switch/case 语句进行范围检查?

java检查char是不是是switch case语句中的数字[关闭]

Spark:在 CASE WHEN 表达式中使用空检查来防止类型错误

同时检查多个布尔返回

可空类型:在 c# 中检查空或零的更好方法