コードインスペクション: ソース式は常に提供されたパターンと一致します
以下の例では、 case string myStr は型チェックのように見えますが、実際には 2 つのことを行います。
System.Stringのインスタンスのstrをチェックします。strがnullではないことを確認します。
ただし、メソッドシグネチャーによれば、 str は 常に System.String のインスタンスであるため、 case string myStr の唯一の目的は、 str が null であるかどうかを確認することです。
そのため、ReSharper は一致式で使われている型パターンがコードの本来のセマンティクス、つまり 単なる null チェックであることを示していないと通知します。
パターンマッチング式での null チェックのために、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;
}
}
式のタイプが変わらないときにタイプパターンの代わりにオブジェクトパターンを使用すると、次の利点があります。
コードを読んだ人なら誰でも、これは単なる null チェックであることがわかります。
例えば、初期の例のコードをリファクタリングして
strパラメーターの型をobjectに変更しても、コードは引き続きコンパイルされますが、型チェックが行われるようになり、ランタイムでコード挙動が変化するまで気づかないかもしれません。 一方、{ } myStrは常に null チェックを行い、strの型に関係なく同様に動作します。
2026 年 6 月 12 日