前言
下面这段代码,你能发现什么问题吗?
public static int? Test1(string str)
{return str switch{"A" => 1,"B" => 2,"C" => 3,_ => default,};
}
public static int? Test2(string str)
{switch (str){case "A":return 1;case "B":return 2;case "C":return 3;default:return default;}
}
好像没什么问题,执行下列代码:
Console.WriteLine("Test1:" + Test1("My IO"));
Console.WriteLine("Test2:" + Test2("My IO"));
现在你看到问题了吧!Test1返回了int而不是int?的默认值!
什么是default文本
从 C# 7.1 开始,当编译器可以推断表达式类型时,可以使用 default 文本生成类型的默认值。default 文本表达式生成与 default(T) 表达式(其中,T 是推断的类型)相同的值。可以在以下任一情况下使用 default 文本:
对变量进行赋值或初始化时。
在声明可选方法参数的默认值时。
在方法调用中提供参数值时。
在 return 语句中或作为表达式主体成员中的表达式时。
bug
问题就在于,编译器推断错了类型。
反编译生成的代码:
可以看到,编译器把switch表达式中的default转换成0,而把switch语句中的default转换成null。
结论
解决方法也简单,换成default(int?)
或者直接用null
。
总之,慎用default,你不知道编译器都做了啥!