有BUG!!!慎用default文本
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有BUG!!!慎用default文本相关的知识,希望对你有一定的参考价值。
前言
下面这段代码,你能发现什么问题吗?
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,你不知道编译器都做了啥!
以上是关于有BUG!!!慎用default文本的主要内容,如果未能解决你的问题,请参考以下文章