如何在switch模式匹配块中编写多表达式函数体?
如何在switch模式匹配块中编写多表达式函数体?
没问题,我之前也碰到过这个困惑!你想要在switch模式匹配的分支里执行多个语句再返回值的需求完全可行,只是需要注意语法上的小细节。
你之前的思路是对的,确实可以在switch的case分支里用大括号包裹多个表达式/语句,但要记住必须通过return明确返回该分支对应的值,因为Handle方法要求传入的lambda返回bool类型。
先给你看修正后的可运行代码:
catch (AggregateException ex) { ex = ex.Flatten(); ex.Handle(e => e switch { TaskCanceledException => { Console.WriteLine("hello world"); // 这里可以添加任意多的语句,比如日志记录、清理操作等 return true; }, _ => false }); }
为什么你之前的尝试可能失败?
大概率是语法上的小疏漏——比如语句块里忘记加return,或者大括号的位置不对。switch表达式的每个分支有两种合法形式:
- 简洁的表达式形式:直接写返回值(比如你原来的
TaskCanceledException => true) - 完整的语句块形式:用大括号包裹多个语句,最后通过
return返回对应值(就是上面示例里的写法)
额外小建议
如果这个分支里的逻辑比较复杂,或者需要复用,不如把这部分逻辑抽成一个单独的辅助方法,代码会更清晰:
private static bool HandleCanceledTask(Exception exception) { Console.WriteLine("hello world"); // 这里可以加更多复杂逻辑,比如记录详细日志、释放资源等 return true; }
然后在switch表达式里直接调用这个方法:
catch (AggregateException ex) { ex = ex.Flatten(); ex.Handle(e => e switch { TaskCanceledException => HandleCanceledTask(e), _ => false }); }
这样既满足了多语句的需求,也让代码的可读性和可维护性更好~
内容来源于stack exchange
相关产品推荐
相关产品推荐

