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

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

  • CS8116: パターンで null 許容型を使用することは有効ではありません。代わりに基になる型を使用してください。
  • CS8117: パターン一致のオペランドが無効です。値は必須ですが、式が見つかりました。
  • CS8119: switch 式は値である必要があります。式が見つかりました。
  • CS8120: switch のケースに到達できません。すでに前のケースで処理済みであるか、一致することができません。
  • CS8121: ソース型の式は、ターゲット型のパターンでは処理できません。
  • CS8208: パターンで型 'dynamic' を使用することは有効ではありません。
  • CS8502: タプル型と一致させるには、指定されたサブパターンが必要ですが、正しくないサブパターンが存在します。
  • CS8503: プロパティ サブパターンでは、プロパティまたはフィールドへの参照を照合する必要があります (例: '{{ Name: value }}'
  • CS8504: パターンがありません
  • CS8505: 既定のリテラル 'default' はパターンとして有効ではありません。必要に応じて、別のリテラル ('0' や 'null' など) を使用します。すべてを照合するには、破棄パターン '_' を使用します。
  • CS8506: switch 式に最適な型が見つかりませんでした。
  • CS8508: パターンの構文 'var' は型を参照できませんが、 var 型はここでスコープ内にあります。
  • CS8509: switch 式は、その入力型のすべての使用可能な値を処理するわけではありません (網羅的ではありません)。たとえば、パターン '...' などです。は対象外です。
  • CS8510: パターンに到達できません。すでに switch 式の前のアームで処理されているか、一致させることが不可能です。
  • CS8512: 名前 '_' は、破棄パターンではなく定数を参照します。値を破棄するには 'var _' を使用し、その名前で定数を参照する場合は '@_' を使用します。
  • CS8513: 名前 '_' は、破棄パターンではなく、 _型を参照します。型には '@_' を使用し、破棄するには 'var _' を使用します。
  • CS8515: スイッチ 制御式の周囲には丸かっこが必要です。
  • CS8516: 名前はタプル要素 '{1}' を識別しません。
  • CS8517: 名前が対応する 'Deconstruct' パラメーターと一致しません。
  • CS8518: この型の式は、指定されたパターンと一致することはできません。
  • CS8519: 指定された式が指定されたパターンと一致することはありません。
  • CS8520: 指定された式は、指定された定数と常に一致します。
  • CS8521: ポインター型のパターン マッチングは許可されていません。
  • CS8522: 'System.Runtime.CompilerServices.ITuple' を使用してパターンマッチングを行う場合、要素名は許可されません。
  • CS8523: 破棄パターンは、switch ステートメントのケース ラベルとして許可されていません。破棄パターンには 'case var _:' を使用し、'_' という名前の定数には 'case @_:' を使用します。
  • CS8524: switch 式は、名前のない列挙値を含む入力型の一部の値を処理しません (網羅的ではありません)。
  • CS8525: 変数指定子は、プロパティ パターンの後に含める必要があります。
  • CS8780: 変数を 'not' または 'or' パターン内で宣言することはできません。
  • CS8781: リレーショナル パターンは、この型の値には使用できません。
  • CS8782: 浮動小数点 NaN にはリレーショナル パターンを使用できません。
  • CS8793: 指定された式は、指定されたパターンと常に一致します。
  • CS8794: 型 '{0}' の式は、指定されたパターンと常に一致します。
  • CS8846: switch 式は、その入力型のすべての使用可能な値を処理するわけではありません (網羅的ではありません)。たとえば、このパターンはカバーされていません。ただし、"when" 句を持つパターンは、この値と正常に一致する可能性があります。
  • CS8918: 識別子または単純なメンバー アクセスが必要です。
  • CS8978: '...'を null 許容にすることはできません。
  • CS8979: リスト パターンは、型 '...' の値には使用できません。
  • CS8980: スライス パターンは、リスト パターン内で 1 回だけ直接使用できます。
  • CS8985: リスト パターンは、型 '...' の値には使用できません。適切な 'Length' または 'Count' プロパティが見つかりませんでした。
  • CS9013: 文字列 'null' 定数は、'...' のパターンとしてサポートされていません。代わりに空の文字列を使用してください。
  • CS9060: '...' で数値定数またはリレーショナル パターンを使用できませんこれは、'INumberBase<T>' から継承または拡張されるためです。特定の数値型に絞り込むには、型パターンを使用することを検討してください。
  • CS9134: switch 式のアームが 'case' キーワードで始まっていません。
  • CS9135: 型の定数値が必要です
  • CS9336: パターンは冗長です。
  • CS9337: パターンが複雑すぎて、冗長性を分析する必要があります。
  • CS9344: '==' 演算子はパターンではサポートされていません。
  • CS9345: '!=' 演算子はパターンではサポートされていません。否定されたパターンを表すには、'not' を使用します。
  • CS9372: 型の式は、このパターンでは処理できません。この場所で追加のエラーが表示されます。

Switch 式の構文エラー

  • CS8119: switch 式は値である必要があります。式が見つかりました。
  • CS8504: パターンがありません
  • CS8505: 既定のリテラル 'default' はパターンとして有効ではありません。必要に応じて、別のリテラル ('0' や 'null' など) を使用します。すべてを照合するには、破棄パターン '_' を使用します。
  • CS8506: switch 式に最適な型が見つかりませんでした。
  • CS8515: 式を制御する switch の両側には、必ず括弧を付ける必要があります。
  • CS8523: 破棄パターンは、switch ステートメントのケース ラベルとして許可されていません。破棄パターンには 'case var _:' を使用し、'_' という名前の定数には 'case @_:' を使用します。
  • CS9134: switch 式のアームは、「case」キーワードで始まることはありません。
  • CS9135: 型の定数値が必要です
  • CS9344: '==' 演算子はパターンではサポートされていません。
  • CS9345: '!=' 演算子はパターンではサポートされていません。否定されたパターンを表すには、'not' を使用します。

switchステートメントまたは式 (CS8119) の制御式として値を指定します。 制御式は値を生成する必要があります。 型、名前空間、メソッド グループ、および voidを返すメソッドは無効です。 値として評価される式を利用してください。

必要なパターンを指定します (CS8504)。 switch arm または is 式には、適切な構文の後にパターンが必要です。 有効なパターン式を必ず含めてください。

default リテラルをパターンとして使用しないでください (CS8505)。 default キーワードはパターン マッチングでは有効ではありません。 代わりに、 0null などの特定のリテラル値を使用するか、破棄パターン _ を使用して任意の値と一致させます。

コンパイラがアームから最適な型を推測できない場合に、switch 式の結果に明示的な型を指定します (CS8506)。 このエラーは、メソッド グループやラムダなど、コンパイラが自動的に推論できる共通の型を共有していないさまざまな型の値をアームが返す場合に発生します。 varを使用する代わりに、明示的に型指定された変数に結果を割り当てます。

switch ステートメントの制御式は丸括弧で囲み、本文を中括弧で囲んでください (CS8515)。 switch ステートメントでは、評価される式を括弧で囲み、本体を中括弧で囲む必要があります。 このエラーは、丸括弧または波括弧がない場合に発生します。

switch ステートメントのケース ラベルとして、単なる「discard _」の代わりに case var _: を使用してください (CS8523)。 switch ステートメントでは、 _という名前の定数があいまいであるため、ベア 破棄パターンは使用できません。 case var _: を使用すると破棄、case @_: を使用すると _ という名前の定数に一致させます。

switch 式アームから case キーワードを削除します。 Switch 式では、switch ステートメントとは異なる構文が使用されます (CS9134)。 switch 式では、各 arm は、パターンとそれに続く => トークンと式で構成され、switch ステートメントで使用される case キーワードはありません。 パターンで変数ではなく定数値を使用します。 パターン マッチングにはコンパイル時定数 (CS9135) が必要です。 変数はパターンとして使用できません。 コンパイラは、コンパイル時に正確な値を認識して、適切な一致するコードを生成する必要があります。

パターンの<演算子と>演算子 (<=>=) ではなく、関係パターン演算子 (not==!=) または キーワードを使用します。 等値演算子と不等値演算子は、パターン構文ではサポートされていません。 等値には定数パターンを使用し、等しくない場合は not キーワードを使用します。

正しい構文の詳細については、「 Switch 式」を参照してください。

パターンの完全性と冗長性

  • CS8120: switch のケースに到達できません。すでに前のケースで処理済みであるか、一致することができません。
  • CS8509: switch 式は、その入力型のすべての使用可能な値を処理するわけではありません (網羅的ではありません)。たとえば、パターン '...' などです。は対象外です。
  • CS8510: パターンに到達できません。そのパターンは、switch 式の前の分岐ですでに処理済みであるか、あるいは一致することができません。
  • CS8518: 型の式は、指定されたパターンと一致することはできません。
  • CS8519: 指定された式が指定されたパターンと一致することはありません。
  • CS8520: 指定された式は、指定された定数と常に一致します。
  • CS8524: switch 式は、名前のない列挙値を含む入力型の一部の値を処理しません (網羅的ではありません)。たとえば、示されたパターンはカバーされません。
  • CS8793: 指定された式は、指定されたパターンと常に一致します。
  • CS8794: 型の式は、指定されたパターンと常に一致します。
  • CS8846: switch 式は、その入力型のすべての使用可能な値を処理するわけではありません (網羅的ではありません)。たとえば、示されたパターンはカバーされません。ただし、"when" 句を持つパターンは、この値と正常に一致する可能性があります。
  • CS9336: パターンは冗長です。
  • CS9337: パターンが複雑すぎて、冗長性を分析する必要があります。

switch ステートメント (CS8120) で、到達できないケース ラベルの順序を変更または削除します。 前のケースが、後のケースと一致するすべての値を既に処理している場合、 case ラベルに到達できません。 この状況は、より一般的なパターンが特定のパターンより前に表示される場合、またはパターンが入力の種類に一致できない場合に発生します。

可能なすべての入力値を処理するスイッチ アームを追加して、完全なスイッチ式 (CS8509CS8524CS8846) を作成します。 switch式は、入力型のすべての可能な値をカバーする必要があります。 それ以外の場合、コンパイラは式がすべての入力に対して結果を生成することを保証できません。 コンパイラは、名前のない列挙値 (CS8524) と、 when 句がそれ以外のハンドルされない値 (CS8846) と一致する可能性がある場合に個別に警告します。 破棄パターン (_) を最終的なキャッチオール アームとして使用して、明示的に処理する必要のない残りの値と一致させます。

到達不可能な switch 式の分岐の並べ替や削除 (CS8510)。 ステートメントの switch と同様に、このエラーは、前のアームが、後のアームが一致するすべての値を既に処理しているため、スイッチ式アームに到達不能であることを示します。

入力に一致することも常に一致することもできないパターンを確認します (CS8518CS8519CS8520CS8793CS8794)。 これらの診断は、コンパイラがコンパイル時に、パターンが常に一致するかどうかを判断できることを示します。 常に一致するパターンは冗長であり、一致しないパターンはデッド コードです。 どちらもロジック エラーを示している可能性があります。

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

網羅性の要件とパターンの最適化の詳細については、「 Switch 式Switch ステートメント、および パターン」を参照してください。

型パターンのエラー

  • CS8116: パターンで null 許容型を使用することは有効ではありません。代わりに基になる型を使用してください。
  • CS8117: パターン一致のオペランドが無効です。値は必須ですが、式が見つかりました。
  • CS8121: ソース型の式は、ターゲット型のパターンでは処理できません。
  • CS8208: パターンで型 'dynamic' を使用することは有効ではありません。
  • CS8508: パターンの構文 'var' は型を参照できませんが、 var 型はここでスコープ内にあります。
  • CS8513: 名前 '_' は、破棄パターンではなく、 _型を参照します。型には '@_' を使用し、破棄するには 'var _' を使用します。
  • CS8521: ポインター型のパターン マッチングは許可されていません。
  • CS8781: リレーショナル パターンは、型の値には使用できません。
  • CS8782: 浮動小数点 NaN にはリレーショナル パターンを使用できません。
  • CS8978: '...'を null 許容にすることはできません。
  • CS9060: '...' で数値定数またはリレーショナル パターンを使用できませんこれは、'INumberBase<T>' を継承または拡張するためです。特定の数値型に絞り込むには、型パターンを使用することを検討してください。
  • CS9372: 型の式は、このパターンでは処理できません。この場所で追加のエラーが表示されます。

パターンで null 許容型の代わりに基になる型を使用します (CS8116)。 型パターンで直接 int? のような null 許容値型を使用することはできません。 その代わりに、基になる型 (int) を使用することで、そのパターンは null 許容値と null 非許容値の両方に一致します。

パターン 一致のオペランドとして値を指定します (CS8117)。 is式の左側には、型、名前空間、またはメソッド グループではなく値を指定する必要があります。 最初に変数に結果を代入するか、値を生成する別の式を使用します。

式の型 (CS8121) と互換性のあるパターン型を使用します。 式の型とパターン型の間に変換できない場合、コンパイラによってこのエラーが発生します。 たとえば、 string 式を int 型パターンと照合することはできません。 パターン型を式と互換性のある型に変更するか、式を互換性のある型にキャストします。

パターンの型として dynamic を使用しないでください (CS8208)。 パターン マッチングでは、 dynamic 型はサポートされていません。 代わりに object を使用するか、一致する前に値を特定の型にキャストします。

var型の名前を変更するか、パターンで明示的な型を使用します (CS8508)。 varという名前の型がスコープ内にある場合、var パターン構文はあいまいです。 コンパイラは、 var パターンを使用するのか、型を参照するのかを判断できません。 完全修飾型名を使用するか、型の名前を変更して競合を回避します。

@_を使用して _ という名前の型を参照するか、破棄パターンにvar _を使用します (CS8513)。 _という名前の型がスコープ内にある場合、コンパイラは、パターン内の_が型または破棄パターンを参照しているかどうかを判断できません。

ポインター型 (CS8521) でパターン マッチングを使用しないでください。 パターン マッチング式では、ポインター型はサポートされていません。 代わりに明示的な比較またはキャストを使用してください。

サポートされている型(CS8781CS8782)をリレーショナル パターンで使用します。 リレーショナル パターン (<><=>=) は、比較をサポートする数値型でのみ機能します。 NaN 比較では常に falseが返されるため、NaN 値と共に使用することはできません。

null 許容にできない型 (CS8978) を使用する場合は、基になる型をパターンで直接使用します。 System.Nullable<T>、ポインター型、ref 構造体型などの型を null 許容にすることはできません。 パターン マッチング ロジックでは、基本型を使用する必要があります。

数値定数またはリレーショナル パターン (CS9060) を適用する前に、型パターンを使用してジェネリック数値型を特定の数値型に絞り込みます。 数値定数またはリレーショナル パターンを使用して INumberBase<T> を直接実装するジェネリック数値型を照合することはできません。 コンパイラは、どの特定の数値型が一致するかを判断できません。 最初に、 intdoubledecimalなどの具体的な数値型に値を絞り込む必要があります。

共用体値 (CS9372) に対して照合する場合は、正しいパターン 形式を使用します。 共用体の型のパターンは、共用体の値自体ではなく、共用体の Value プロパティに適用されます。 パターンが式を処理できないことをコンパイラが報告する場合は、共用体宣言に記載されているケース型と照合していることを確認します。 無効な特定のパターンの詳細については、同じ場所にある追加のエラーを確認してください。

型パターンの詳細については、「 Null 許容値型パターンおよびジェネリック算術演算」を参照してください。

パターン エラーを一覧表示する

  • CS8979: リスト パターンは、型 '...' の値には使用できません。
  • CS8980: スライス パターンは、リスト パターン内で 1 回だけ直接使用できます。
  • CS8985: リスト パターンは、型 '...' の値には使用できません。適切な 'Length' または 'Count' プロパティが見つかりませんでした。
  • CS9013: 文字列 'null' 定数は、'...' のパターンとしてサポートされていません。代わりに空の文字列を使用してください。

型がリスト パターンに必要な操作をサポートしていることを確認します。 リスト パターンには、カウント可能でインデックス付け可能な型 (CS8979CS8985) が必要です。 型には、アクセス可能な Length または Count プロパティがあり、インデックス作成をサポートしている必要があります。 リスト パターンをサポートするランタイム型には、配列、 List<T>Span<T>、および適切なメンバーを持つその他のコレクション型が含まれます。

スライス パターン (..) をリスト パターン内に直接配置します。 リスト パターンごとに 1 回だけ使用します。これは、入れ子になったパターンやリスト パターンの外部に表示できないためです (CS8980)。

Span<char>型またはReadOnlySpan<char>型と一致する場合は、文字列 null 定数の代わりに空の文字列""を使用します。 リテラル null は、スパン型 (CS9013) のパターンとしてサポートされていません。

リスト パターンの要件と構文の詳細については、「 リスト パターンパターン」を参照してください。

サブパターン エラー

  • CS8502: タプル型の照合にはサブパターンが必要ですが、正しくないサブパターンが存在します。
  • CS8503: プロパティ サブパターンでは、プロパティまたはフィールドへの参照を照合する必要があります (例: '{{ Name: value }}'
  • CS8512: 名前 '_' は、破棄パターンではなく定数を参照します。値を破棄するには 'var _' を使用し、その名前で定数を参照する場合は '@_' を使用します。
  • CS8516: 名前はタプル要素を識別しません。
  • CS8517: 名前が対応する 'Deconstruct' パラメーターと一致しません。
  • CS8522: 'System.Runtime.CompilerServices.ITuple' を使用してパターンマッチングを行う場合、要素名は許可されません。
  • CS8525: 変数指定子は、プロパティ パターンの後に含める必要があります。
  • CS8780: 変数を 'not' または 'or' パターン内で宣言することはできません。
  • CS8918: 識別子または単純なメンバー アクセスが必要です。

タプル型 (CS8502) と一致する場合は、正しい数のサブパターンを指定します。 位置指定パターンのサブパターンの数は、タプル型の要素の数と一致する必要があります。 タプルのアリティに合わせてサブパターンを追加または削除します。

プロパティサブパターン (CS8503) にプロパティまたはフィールド名を含めます。 各プロパティ サブパターンでは、一致するプロパティまたはフィールドを指定する必要があります。 構文 { PropertyName: pattern } を使用してメンバーを識別します。

破棄パターンにはを使用し、(CS8512)という名前の定数にはを使用します。 _という名前の定数がスコープ内にある場合、_ ラベル内のベア caseは定数を参照します。 破棄パターンを使用するには、代わりに var _ 書き込みます。

タプル (CS8516) と分解型 (CS8517) の位置指定パターンで正しい要素名を使用します。 位置指定パターンでサブパターンに名前を付けるとき、名前はタプル要素名または Deconstruct メソッドパラメーター名と一致する必要があります。

ITuple (CS8522) を使用して照合する場合は、位置指定パターンで要素名を使用しないでください。 ITuple メソッドではなく、Deconstruct インターフェイスを介して型が一致する場合、名前付き要素はありません。 パターンから要素名を削除します。

変数指定子は、その前ではなくプロパティ パターンの後に配置します (CS8525)。 変数が指定されたプロパティ パターンでは、変数名はパターンの右中かっこに従う必要があります。 たとえば、{ Length: > 0 } sではなくs { Length: > 0 }を記述します。

not または or パターン コンバイネータ (CS8780) 内で変数を宣言することはできません。 not パターンの変数宣言は確実に割り当てられず、or パターンの変数は 1 つのブランチでのみ割り当てられます。 パターンコンバイネータの外側に変数宣言を移動します。

プロパティ パターンおよび位置サブパターン (CS8918) では、識別子または単純なメンバー アクセス式をプロパティ名として使用します。 複合式、メソッド呼び出し、またはその他の単純でないメンバー アクセスは、プロパティ サブパターンの左側としては有効ではありません。 各サブパターン名は、直接プロパティまたはフィールド名、または Property.SubPropertyのような点線のメンバー アクセス パスである必要があります。

サブパターン構文の詳細については、「 プロパティ パターン位置パターン」を参照してください。