次の方法で共有


パターン マッチング式のエラーと警告を解決する

この記事では、コンパイラの次のエラーと警告について説明します。

  • CS8509: switch 式は、その入力型のすべての使用可能な値を処理するわけではありません (網羅的ではありません)。たとえば、パターン '...' などです。は対象外です。
  • CS9134: switch 式のアームが 'case' キーワードで始まっていません。
  • CS9135: 型の定数値が必要です
  • CS9335、CS9336: パターンは冗長です。
  • CS9337: パターンが複雑すぎて、冗長性を分析する必要があります。

Switch 式の構文エラー

  • CS9134: switch 式アームが 'case' キーワードで始まらない。
  • CS9135: 型の定数値が必要です

switch 式を正しく記述するには、適切な構文規則に従います。 詳細については、「switch式」を参照してください。

  • switch 式で case キーワードを使用しないでください (CS9134)。 case キーワードは switch ステートメントで使用され、switch 式では使用されません。 switch 式では、各アームはパターン、オプションのケース ガード、 => トークン、および式で構成されます。
  • 変数ではなく、パターンで定数値を使用します (CS9135)。 パターン マッチングには、値パターンのコンパイル時定数が必要です。

次の例は、 caseの構文エラーを示しています。

var answer = x switch
{
    // CS9134: remove the keyword "case" from each switch arm:
    case 0 => false,
    case 1 => true,
}

このエラーを修正するには、 case キーワードを削除します。

var answer = x switch
{
    0 => false,
    1 => true,
}

不完全なパターン マッチング

  • CS8509: switch 式は、その入力型のすべての使用可能な値を処理するわけではありません (網羅的ではありません)。たとえば、パターン '...' などです。は対象外です。

完全なスイッチ式を作成するには、考えられるすべての入力値について説明します。 詳細については、「Switch 式」および「Switch ステートメント」を参照してください。

使用可能なすべての入力値を処理するスイッチ アームを追加します。 破棄パターン (_) を使用して、明示的に処理する必要のない残りの値と一致させます。

次の例では CS8509 が生成されます。

// CS8509.cs
enum EnumValues
{
    Value1,
    Value2,
    Value3
}

void Method(EnumValues enumValues)
{
    var result = enumValues switch
    {
        EnumValues.Value1 => 1,
        EnumValues.Value2 => 2,
    };
}

この警告を修正するには、既定の arm を追加します。

enum EnumValues
{
    Value1,
    Value2,
    Value3
}

void Method(EnumValues enumValues)
{
    var result = enumValues switch
    {
        EnumValues.Value1 => 1,
        EnumValues.Value2 => 2,
        EnumValues.Value3 => 3,
        _ => throw new ArgumentException("Input isn't a valid enum value", nameof(enumValues)),
        };
}

_ パターンは、残りのすべての値と一致します。 このパターンを使用して、無効または予期しない値を処理できます。

冗長パターン

  • CS9335、CS9336: パターンは冗長です。
  • CS9337: パターンが複雑すぎて、冗長性を分析する必要があります。

明確なパターン マッチング式を記述するには、冗長なパターンを使用しないでください。 詳細については、「 パターン」を参照してください。

  • コンパイラが冗長として識別するパターンを確認します (CS9335CS9336)。 冗長パターンは、 not または異なる論理演算子を使用することを意図したロジック エラーを示す可能性があります。
  • コンパイラが分析するのが難しすぎる複雑なパターンを簡略化する (CS9337)。 複雑なパターンをよりシンプルで保守しやすい式に分割します。

次の例は、冗長パターンを示しています。

_ = o is not null or 42; // warning: pattern "42" is redundant
_ = o is not int or string; // warning: pattern "string" is redundant

この警告は、最上位レベルでis not (null or 42)を使用するのではなく、is not (int or string)またはorを意図している可能性があることを示しています。