如果我的 C# switch 表达式不是详尽的会发生啥?

Posted

技术标签:

【中文标题】如果我的 C# switch 表达式不是详尽的会发生啥?【英文标题】:What happens if my C# switch expression is non-exhaustive?如果我的 C# switch 表达式不是详尽的会发生什么? 【发布时间】:2019-09-27 19:15:43 【问题描述】:

在 C# 8 中,引入了 switch 表达式。如果 switch 表达式不详尽会发生什么?换句话说,如果我不测试每个可能的值会发生什么?

    static void Main(string[] args)
    
        int x = 1;
        int imExhaustive = x switch
        
            3 => 4,
            _ => 0   // x = 1 matches this
        ;
        int okFine = x switch
        
            1 => 4   // x = 1 matches this
        ;
        int noMatch = x switch
        
            3 => 4   // No match
        ;
    

【问题讨论】:

【参考方案1】:

如果switch 表达式不详尽,编译器会产生警告。 在运行时,如果您传递未处理的值,则会抛出 SwitchExpressionException

这在 C# 8.0 中新模式功能的 speclet 中有记录:https://github.com/dotnet/csharplang/blob/master/proposals/csharp-8.0/patterns.md#switch-expression

如果证明(使用那些 技术)某些可能的输入值可能与某些不匹配 switch_expression_arm 在运行时。

在运行时,switch_expression 的结果是 表达式的第一个 switch_expression_arm 的表达式 switch_expression 左侧的匹配 switch_expression_arm 的模式,而 case_guard 的 switch_expression_arm,如果存在,评估为真。

如果没有 这样的 switch_expression_arm,switch_expression 会抛出一个实例 例外的 System.Runtime.CompilerServices.SwitchExpressionException。

【讨论】:

使用默认或 '_' 选项总是可以使他们的 switch 表达式详尽无遗。【参考方案2】:

视情况而定。

如果有匹配:匹配,一切都很好。

如果没有匹配:SwitchExpressionException 被抛出。

最佳实践似乎是编写详尽的开关表达式。如果你不这样做,并且没有爆炸,你可能只是走运了。

如果你的 switch 表达式不详尽,编译器会警告你,但这不是错误,它会编译并运行。

(刚刚遇到这个,所以我想分享一下 - 虽然 C# 8 仍处于预览阶段,但它还没有出现在文档中)

【讨论】:

【参考方案3】:

要删除此警告,请添加默认表达式。

   exception switch
    
        ValidationException vExp => new ValidationErrorDetail
        
            
        ,
        ApiException apiExp => new ApiErrorDetail
        
           
        ,
        ProcessException pExp => new ErrorDetail
        
           
        ,
        _ => new ErrorDetail
        

        
    ;

添加_ =>和要执行的默认表达式。

【讨论】:

以上是关于如果我的 C# switch 表达式不是详尽的会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

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

Switch 语句必须详尽 - Xcode 错误?

在 C# switch 表达式中使用块?

Xcode 12 中的 Switch 必须详尽无遗

具有 void 返回类型的 switch 表达式

枚举的详尽 switch 语句的静态分析 [重复]