コードインスペクション: ソース式は常に提供されたパターンに一致します。
以下の例では、 case string myStr は型チェックのように見えますが、実際には 2 つのことを行います。
System.Stringのインスタンスのstrをチェックします。strがnullではないことを確認します。
ただし、メソッドシグネチャーによれば、 str は 常に System.String のインスタンスであるため、 case string myStr の唯一の目的は、 str が null であるかどうかを確認することです。
そのため、JetBrains Rider は、マッチング式で使われている型パターンがコードの実際のセマンティクス、つまり 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 日