C#模式匹配中如何正确实现x不是a或不是b的判断?
C#模式匹配实现否定多值判断的正确方式
你遇到的问题源于逻辑运算符优先级和逻辑规则的误解,先拆解两种错误写法的问题:
- 第一种写法
GetInt() is not 4 or 3:not的优先级高于or,实际等价于(GetInt() is not 4) or (GetInt() is 3)。当返回3时,3 is 3为true,因此整个条件成立,触发第一个分支。 - 第二种写法
GetInt() is not 3 or not 4:逻辑上等价于“不是3,或者不是4”——对整数来说,任何数都不可能同时是3和4,所以这个条件永远为true,IDE会置灰无效代码,且永远走第一个分支。
正确实现方式
如果你需要判断值既不是3也不是4(即否定“是3或4”的正向判断),需要用括号将多值模式分组,再用not否定:
int GetInt() => 3; if (GetInt() is not (3 or 4)) { Console.WriteLine("既不是3也不是4"); } else { Console.WriteLine("是3或者4"); }
当GetInt()返回3时,条件不成立,会进入else分支输出“是3或者4”,符合预期。
如果你的需求确实是逻辑上的“不是3 或者 不是4”,第二种写法逻辑本身是对的,但因为该条件永远为真,所以没有实际业务价值,IDE会提示无效代码。
内容的提问来源于stack exchange,提问作者Suricat
相关产品推荐
相关产品推荐

