有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文本的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#慎用JSON.stringfy

vscode代码片段建议bug

慎用 JSON.stringify

安卓webview加载 h5页面 奔溃bug

慎用 -race 选项

C++ 中 ZeroMemorymemset 危险需慎用