文字列リテラル宣言のエラーと警告を解決する

構文が正しくない文字列リテラルを宣言するか、サポートされていないコンテキストで使用すると、C# コンパイラによってエラーと警告が生成されます。 これらの診断は、基本的な文字列リテラル、文字リテラル、生の文字列リテラル、UTF-8 文字列リテラルに関する問題を特定するのに役立ちます。

  • CS1009: 認識されないエスケープ シーケンス。
  • CS1010: 定数の改行。
  • CS1011: 空の文字リテラル。
  • CS1012: 文字リテラル内の文字が多すぎます。
  • CS1039: 終端化されていない文字列リテラル。
  • CS8996: プリプロセッサ ディレクティブでは、未加工の文字列リテラルは使用できません。
  • CS8997: 終了していない生の文字列リテラル。
  • CS8998: この生の文字列コンテンツの開始引用符が足りません。
  • CS8999: 行は、生の文字列リテラルの終了行と同じ空白文字で始まらない。
  • CS9000: 生文字列リテラル区切り記号は、それ自体の行にある必要があります。
  • CS9001: 複数行の生文字列リテラルは、逐語的な補間文字列でのみ使用できます。
  • CS9002: 複数行の生文字列リテラルには、少なくとも 1 行のコンテンツが含まれている必要があります。
  • CS9003: 行に想定とは異なる空白が含まれています。
  • CS9004: 未加工の文字列リテラルに十分な引用符がありません。
  • CS9005: 補間された生文字列リテラルに閉じ中括弧が足りません。
  • CS9006: 挿入された生の文字列リテラルに対して開始中かっこが多すぎます。
  • CS9007: 補間された生文字列リテラルに対する終わり括弧が多すぎます。
  • CS9008: '@' 文字のシーケンスは使用できません。
  • CS9009: 文字列は引用符で始まる必要があります。
  • CS9026: 入力文字列を同等の UTF-8 バイト表現に変換することはできません。
  • CS9047: UTF-8 バイト表現ではないオペランドには演算子を適用できません。
  • CS9274: XXHash128 が別の文字列リテラルと競合しているため、この文字列リテラルをデータ セクションに出力できません。
  • CS9315: プログラムによって使用されるユーザー文字列の合計長が、許可された制限を超えています。文字列リテラルを追加するには、アプリケーションを再起動する必要があります。

正しくない形式の文字列リテラル

  • CS1009 - 認識できないエスケープ シーケンス。
  • CS1010 - 定数の改行。
  • CS1011 - 空の文字リテラル。
  • CS1012 - 文字リテラル内の文字が多すぎます。
  • CS1039 - 終端化されていない文字列リテラル。

これらのエラーを修正するには、次の手法を適用します。

  • (改行)、\n (タブ)、\t (円記号)、\\ (二重引用符) (\") など、C# 言語仕様で定義されている標準エスケープ シーケンスのいずれかを使用します。 コンパイラは、言語仕様の一部ではないエスケープ シーケンスを認識しないため、未定義のエスケープ シーケンスを使用すると、コンパイラが表す文字を特定できないため、このエラーが発生します。
  • 終了引用符文字を追加して、文字列リテラル (CS1039) を完成させます。 文字列リテラルには開始区切り記号と終了区切り記号の両方が必要です。そのため、終端化されていない文字列を使用すると、コンパイラは後続のソース コードを文字列コンテンツの一部として処理するため、解析エラーが発生します。
  • 文字リテラルの 'CS1011' のシングルクォートの間にちょうど1つの文字を追加します。 'CS1012' の場合も同様です。 文字リテラルは 1 つの文字値を表し、1 文字または有効なエスケープ シーケンスを正確に含める必要があるため、空の文字リテラルまたは複数の文字を含む文字は、 char 型の言語規則に違反します。
  • 複数のソース行にまたがる文字列リテラルを分割するには、 + 演算子を使用して各行を終了引用符で終え、次の行を開始します (CS1010)。 終了引用符は開始引用符と同じ行に記述する必要があるため、通常の文字列リテラルには実際の改行文字を含めることはできませんが、連結または 逐語的な文字列 または 生の文字列リテラルを使用して複数行の文字列を実現できます。これにより、文字列コンテンツの一部として改行を埋め込むことができます。

詳細については、 文字列を参照してください。

形式が正しくない未加工の文字列リテラル

  • CS8996 - プリプロセッサ ディレクティブでは、未加工の文字列リテラルは使用できません。
  • CS8997 - 未終了の生文字列リテラル。
  • CS8998 - この生の文字列コンテンツに対して十分な開始引用符がありません。
  • CS8999 - 行は、生文字列リテラルの終了行と同じ空白文字で始まらない。
  • CS9000 - 生文字列リテラル区切り記号は、それ自体の行に存在する必要があります。
  • CS9001 - 複数行の生文字列リテラルは、逐語的な補間文字列でのみ使用できます。
  • CS9002 - 複数行の生文字列リテラルには、少なくとも 1 行のコンテンツが含まれている必要があります。
  • CS9003 - 行に含まれる空白は、想定とは異なります。
  • CS9004 - 未加工の文字列リテラルに十分な引用符がありません。
  • CS9005 - 補間された未加工の文字列リテラルに十分な閉じかっこがありません。
  • CS9006 - 挿入された生の文字列リテラルに対して開き中括弧が多すぎます。
  • CS9007 - 挿入された未加工文字列リテラルに閉じ括弧が多すぎます。
  • CS9008 - '@' 文字のシーケンスは使用できません。
  • CS9009 - 文字列は引用符で始まる必要があります。

これらのエラーを修正するには、次の手法を適用します。

  • #if#define (#pragma) などのプリプロセッサ ディレクティブでは、生の文字列リテラルではなく、通常の文字列リテラルまたは逐語的な文字列リテラルを使用します。 プリプロセッサ ディレクティブは構文分析が行われる前に前処理フェーズ中に評価されるため、後の構文分析フェーズで生文字列が識別されるため、コンパイラはこれらのコンテキストで生の文字列リテラル構文を認識できません。
  • 開始区切り記号と一致する終了区切り記号を追加して、生の文字列リテラル (CS8997CS9004) を完成させます。 未加工の文字列リテラル構文では、開始区切り記号と終了区切り記号に同じ数の連続する二重引用符文字 (少なくとも 3 つ) が含まれている必要があるため、終了区切り記号が見つからないか不一致があると、コンパイラは文字列コンテンツの終了位置を判断できません。
  • 複数行の生文字列リテラルの開始区切り記号と終了区切り記号を、その行に他の内容を含まない独自の行に配置します (CS9000)。 複数行の生文字列書式ルールでは、区切り記号が専用行を占有して文字列コンテンツの明確な境界を確立し、すべてのコンテンツ行から共通の先頭インデントを削除する空白トリミング動作を有効にする必要があります。
  • 複数行の生文字列リテラル (CS9002) の開始区切り記号と終了区切り記号の間に、少なくとも 1 行のコンテンツを追加します。 言語仕様では、空の複数行の生文字列は目的を果たせず、不完全なコードを示している可能性があるため、複数行の生文字列に実際のコンテンツを含める必要があります。一方、単一行の生文字列 (同じ行に区切り記号を含む) は空で、空の文字列値に適した構文です。
  • 未加工の文字列コンテンツ行のインデントを、終了区切り記号行 (CS8999CS9003) のインデントと一致または超過するように調整します。 生の文字列リテラルの 空白処理規則 では、すべてのコンテンツ行から共通のインデントをトリミングするためのベースラインとして、終了区切り記号の先頭の空白が使用されるため、終了区切り記号よりもインデントの少ないコンテンツ行は、このトリミング アルゴリズムに違反し、不適切な書式設定を示します。
  • 生の文字列区切り文字に含める二重引用符の数を増やして、コンテンツ内の引用符文字の連続した出現を超えるように設定します (CS8998)。 コンパイラが内容の一部である引用符文字と文字列の末尾をマークする区切り記号シーケンスを明確に区別できるように、区切り記号には文字列コンテンツ内の任意のシーケンスよりも多くの連続する引用符が含まれている必要があります。
  • 補間された未加工の文字列リテラルの場合、開始時のドル記号 ($) の数が、リテラル コンテンツとして必要な連続する左中括弧または右中括弧の数 (CS9005CS9006CS9007) と一致していることを確認します。 補間された生の文字列構文では、ドル記号数を使用して中かっこのエスケープ シーケンスの長さを決定するため、$$"""は補間ホールに{{を必要とし、コンテンツとして単一の{文字を許可します。一方、不一致の中かっこシーケンスは、誤った補間構文または異なるドル記号数を必要とするコンテンツを示します。
  • 未加工の文字列リテラルから @ プレフィックスを削除し、引用符文字の区切り記号 (CS9008CS9009) のみを使用します。 生文字列リテラルは、 @ 逐語的な文字列プレフィックスを使用しない C# 11 で導入された個別の構文であり、言語仕様では、 @ 逐語構文と生の文字列区切り記号を組み合わせることはできません。生文字列は既に複数行のコンテンツをサポートしており、エスケープ シーケンスは必要ないためです。

CS9001 は、現在のバージョンの C# では生成されなくなりました。 複数行の生文字列リテラルで、逐語的な形式を必要としない補間がサポートされるようになりました。

詳細については、 未加工の文字列リテラルを参照してください。

UTF-8 の文字列リテラル

  • CS9026 - 入力文字列を同等の UTF-8 バイト表現に変換することはできません。
  • CS9047 - UTF-8 バイト表現ではないオペランドには演算子を適用できません。

これらのエラーを修正するには、次の手法を適用します。

  • u8文字列リテラル (CS9026) から UTF-8 でエンコードできない文字またはエスケープ シーケンスを削除します。 UTF-8 エンコード仕様では完全な Unicode 文字セットがサポートされていますが、有効な Unicode スカラー値が必要であるため、サロゲート コード ポイント (U+D800 から U+DFFF の範囲の値) は、スタンドアロン文字を表す代わりに UTF-16 サロゲート ペア エンコード用に予約されているため、UTF-8 文字列に直接表示できません。UTF-8 としてエンコードしようとすると、無効なバイト シーケンスが生成されます。
  • UTF-8 文字列 (u8) を連結するときに、加算演算子の両方のオペランドが UTF-8 文字列リテラル ( サフィックスでマーク) であることを確認します。 コンパイラは、コンパイル時に UTF-8 文字列リテラルを 連結するための特別なサポートを提供します。 これは、連結された UTF-8 バイト シーケンスを表す ReadOnlySpan<byte> 値を生成しますが、UTF-8 文字列と通常の string 値またはその他の型の混在はサポートされていません。これは、型システムがバイト スパンまたはテキスト文字列を生成するかどうかを判断できないためです。基になる表現 (UTF-8 バイトと UTF-16 文字) は基本的に互換性がありません。

詳細については、 UTF-8 文字列リテラルを参照してください。

データ セクション内のリテラル文字列

  • CS9274: XXHash128 が別の文字列リテラルと競合しているため、この文字列リテラルをデータ セクションに出力できません。
  • CS9315: プログラムによって使用されるユーザー文字列の合計長が、許可された制限を超えています。文字列リテラルを追加するには、アプリケーションを再起動する必要があります。

これらの問題を解決するには、次の手法を試してください。

  • ハッシュ競合 (CS9274) が発生したときに、アプリケーションの実験用データ セクション文字列リテラル機能を無効にします。 このエラーは、2 つの異なる文字列リテラルが同じ XXHash128 値を生成したことを示しています。これにより、最適化が正しく機能しなくなるため、この試験的な動作を可能にする機能フラグを削除する必要があります。
  • データ セクション機能が有効になっているときにデバッグ セッション中に文字列リテラルを変更した後、アプリケーションを再起動します (CS9315)。 ホット リロード インフラストラクチャは、実行時に変更できない特殊な形式で埋め込まれているため、データ セクションに格納されている文字列リテラルを更新できないため、古い文字列値を使用して実行を継続すると、不適切な動作が発生します。