ReSharper 2025.2 Help

代码检查:源表达式始终匹配提供的模式

在下面的示例中, case string myStr 看起来像是类型检查,但实际上执行了两件事:

  • 检查 str 是否是 System.String 的实例。

  • 检查 str 是否不是 null

但根据方法签名, str 始终System.String 的实例,因此 case string myStr 的唯一目的就是检查 str 是否是 null

这就是为什么 ReSharper 通知您匹配表达式中使用的类型模式未显示代码的真实语义,而只是 一个空值检查

对于 模式匹配表达式中的空值检查,C# 8 引入了一种 对象模式 ,其语法如下: { }。 此模式旨在匹配除 null 值以外的所有内容,并在 快速修复中建议使用。

void Test(string str) { switch (str) { case string myStr: // use myStr break; } }
void Test(string str) { switch (str) { case { } myStr: // use myStr break; } }

当表达式的类型未更改时,使用对象模式代替类型模式具有以下优势:

  • 阅读代码的每个人都会看到这只是一个空值检查。

  • 如果您在初始示例中重构代码并将 str 参数的类型更改为 object ,例如,代码将继续编译,但会执行类型检查,您可能不会注意到,直到在运行时看到代码行为的变化。 另一方面, { } myStr 始终会执行空值检查,并且无论 str 的类型如何,行为都类似。

最后修改日期: 2025年 9月 27日