C# switch表达式搭配or模式与带条件默认卫句的行为疑问
C# switch 表达式带or模式与卫句的行为说明
核心原因
C# 中 when 卫句的作用范围是其所属分支的整个左侧模式集合,而非仅绑定到 or 运算符右侧的单个模式。你示例中的分支代码:
"d" or _ when types.Contains(input) => "1"
实际的执行判断逻辑等价于:
先判断输入是否匹配左侧模式(等于
"d"或者匹配任意值,该部分永远返回真),同时满足types.Contains(input)条件,才会命中该分支。
对应等效的普通if逻辑:
if ((input == "d" || true) && types.Contains(input))
你的测试输入为 "d",但 types 集合中仅存储了 "a"、"b"、"c",不包含 "d",因此卫句条件不成立,该分支无法命中,最终进入默认分支返回 "2",和你实际运行结果一致。
符合预期的写法
如果要实现「输入等于 "d" 或输入存在于 types 集合中就命中对应分支」的逻辑,可采用以下两种写法:
写法1:拆分独立分支
var result = input switch { "d" => "1", _ when types.Contains(input) => "1", _ => "2" };
写法2:卫句中合并判断逻辑
var result = input switch { _ when input == "d" || types.Contains(input) => "1", _ => "2" };
内容的提问来源于stack exchange,提问作者baywet
相关产品推荐
相关产品推荐

