【问题标题】:C# 7 switch case with null checks带有空检查的 C# 7 switch case
【发布时间】: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。

标签: c# switch-statement pattern-matching c#-7.0 null-string


【解决方案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 在底层是如何工作的。请参阅我的回答,其中解释了这种模式是如何实现的。
猜你喜欢
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 2020-05-08
相关资源
最近更新 更多