c# 8 switch 表达式不够“聪明”

Posted

技术标签:

【中文标题】c# 8 switch 表达式不够“聪明”【英文标题】:c# 8 switch expression not "smart" enough 【发布时间】:2020-01-10 18:00:02 【问题描述】:

这段代码很简单,就是一个普通的开关:

bool? isSomething = strSomething switch

    "I" => true,
    "D" => false,
    _   => null,
;

但是,编译器给了我以下错误:

CS0037 无法将 null 转换为 'bool',因为它是不可为空的值类型

这个变量显然是一个可以为空的 bool bool?,为什么 c# 编译器不能在我不必强制转换 null 以使其工作的情况下解决这个问题:

_   => (bool?)null,

我没有做对吗?演员不是不必要的吗?

【问题讨论】:

因为表达式通常不是目标类型的。 condition ? 1 : null 也失败了。也不是小事,如果将表情嵌入到更大的表情中呢?那么正确的类型是什么? 【参考方案1】:

在 c# lang 中有一个为此打开的 issue #2387。对于 c# 9,可以在 this candidate 中修复。

【讨论】:

以上是关于c# 8 switch 表达式不够“聪明”的主要内容,如果未能解决你的问题,请参考以下文章

c# 8 switch 表达式:没有找到 switch 表达式的最佳类型

c# 8.0 switch 表达式中的多个案例[重复]

C# 8 switch 表达式:一次处理多个案例?

有没有办法让 switch 使用 C# 8 switch 表达式返回字符串值?

c# 8.0 switch 表达式返回类型和空值

如何声明从 C# 8 switch 表达式返回的参数?