<p>C# 9起,and、or、not仅为模式匹配专用关键字,非通用布尔运算符;and要求所有子模式同时成立,or满足其一即可,not否定整个模式,三者仅在is/switch中有效,不可用于普通布尔表达式,且存在版本兼容性与嵌套限制。</p>

and、or、not 不是 C# 的布尔运算符,也不是通用关键字;它们只在模式匹配上下文中有效,且仅从 C# 9 开始支持——写错位置或混用会直接编译失败。
and 模式:必须同时满足多个条件,但不是“&&”
在 is 或 switch 中,and 用于串联多个子模式,要求全部成立。它不等价于布尔表达式里的 &&,也不能出现在普通 if 条件里。
obj is int x and >= 0 and 合法:先匹配 <code>int类型并解构为x,再依次检查数值范围-
obj is int x && x >= 0合法但属于「类型模式 + 布尔表达式」混合写法,不是纯逻辑模式 if (x > 0 and y 非法:<code>and只能在模式位置(如is右侧、case后)使用- 顺序敏感:左侧失败则右侧不执行,但无隐式性能优化——前项耗时高,整体就慢
or 模式:匹配任一子模式,类型需兼容
or 允许列出多个可选模式,但所有分支必须能统一推导出变量名和类型,否则编译报错。
-
value is 0 or 1 or -1合法:都是int字面量,类型一致 -
obj is string s or int i非法:无法同时绑定s和i,变量名与类型冲突 -
obj is (string s and s.Length > 0) or (int i and i != 0)合法但需括号包裹每个子模式,否则解析歧义 - 短路行为存在:第一个
or分支匹配成功,后续不检查
not 模式:否定整个模式,不是取反操作符
not 是关键字,作用对象是「模式」本身;它不能跟在布尔表达式后,也不能替代 ! 运算符。
-
obj is not null合法且推荐:语义清晰,专用于排除空引用 -
obj is not string合法:匹配所有非string类型的值 -
obj is !(string "")语法错误:!是逻辑模式运算符,只能修饰带括号的嵌套模式,且不适用于常量字符串 -
obj is !null编译失败:!不能单独修饰null,必须用not null -
obj is not (int 42)合法:否定字面量模式,匹配“是 int 但不等于 42”的情况
容易被忽略的兼容性与边界问题
C# 9 引入逻辑模式,但不同版本对嵌套和组合的支持程度不同。C# 10+ 才完整支持 not 与解构模式混用(如 not { Name: "admin" }),而早期版本只认 not null 这类简单形式。
- Visual Studio 2019 默认只支持到 C# 8,需手动改项目文件中的
<LangVersion>才启用and/or/not -
switch表达式中写int i and >= 0时,若分支返回类型不一致(如有的返回string,有的返回int),编译器不会报错但运行时可能意外 fallback 到默认分支 - 模式中嵌套过深(比如三层
and加一层or)会导致 IDE 智能提示变慢,部分旧版 Roslyn 解析器会静默降级为布尔表达式处理 - 别指望
not能否定任意复杂结构:例如not (string s and s.StartsWith("A"))在 C# 11 之前不被支持,得拆成两个分支处理


















