and、or、not 不是 c# 模式语法关键字,c# 10+ 的逻辑模式使用 &&、||、! 运算符(仅在模式上下文中有效),not 是独立否定关键字,! 是需括号的嵌套模式否定符。

and/or/not 在 C# 模式匹配中根本不存在
直接说结论:and、or、not 不是 C# 模式语法中的关键字,也不能像布尔表达式那样直接写在 switch 或 is 表达式里。你看到的类似写法,其实是 C# 10+ 引入的「逻辑模式(logical patterns)」,但它们对应的是 and、or、not 这三个**运算符符号**:&&、||、!,且只在模式上下文中有效。
用 &&、||、! 写逻辑模式的正确姿势
这些运算符只能出现在模式位置(比如 is 右侧、case 后),不能用于普通条件判断——那是布尔表达式的事。它们操作的是「模式」,不是值。
-
&&要求两个子模式都匹配(顺序求值,左→右;左不成立则短路,右不执行) -
||要求至少一个子模式匹配(左成立则短路,右不执行) -
!要求其后模式**不匹配**(注意:不是对值取反,而是对「匹配行为」取反)
示例:
if (obj is string s && s.Length > 5) { ... } // 先匹配 string 类型,再检查 Lengthif (obj is (int x && x > 0) || (double y && y > 0)) { ... } // 匹配正整数或正浮点数if (obj is not null) { ... } // 注意:not 是模式关键字,不是 !;! 仅用于嵌套模式,如 !(int 0)
not 是关键字,! 是运算符,别混用
C# 中 not 是独立的模式关键字,专用于否定整个模式(如 not null、not int)。而 ! 是逻辑模式运算符,只能修饰另一个模式,且必须加括号以明确作用域:
- ✅ 正确:
obj is !(int 42)(匹配所有非字面量 42 的 int,或非 int 的值) - ❌ 错误:
obj is !int(语法错误;int是类型模式,不能直接被!修饰) - ✅ 正确:
obj is not int(更自然、推荐) - ⚠️ 注意:
not和!语义不完全等价:not T否定类型匹配,!(T p)否定带解构的模式匹配
容易踩坑的典型场景
逻辑模式看起来简洁,但实际使用时边界很敏感:
- 嵌套括号易漏:
obj is (string s && s.StartsWith("A")) || (string s && s.StartsWith("B"))必须给每个子模式加括号,否则解析失败 -
!不能单独用:obj is !null非法;必须写成obj is not null - 类型模式和常量模式混用要小心:
obj is int i && i != 0合法;但obj is int i || string s非法(左右类型不同,无法共存于同一is表达式) - 性能无隐式优化:逻辑模式仍是逐个匹配,
a && b中若a耗时高,b不会提前运行,但也没自动缓存结果
真正复杂的组合建议拆成多个 if 或提取为局部函数,别硬塞进单个模式表达式里——可读性和调试成本比语法糖重要得多。









