次の方法で共有


文字列補間式のエラーと警告を解決する

不適切な構文で文字列補間式または文字列補間ハンドラーを宣言するか、サポートされていないコンテキストで使用すると、C# コンパイラによってエラーと警告が生成されます。 これらの診断は、文字列補間またはカスタム文字列補間ハンドラーに関する問題を特定するのに役立ちます。

  • CS8361: 条件式は、":" によって補間が終了するため、文字列補間で直接使用することはできません。条件式をかっこで変更します。
  • CS8941: 挿入文字列ハンドラー メソッドの形式が正しくありません。'void' または 'bool' は返されません。
  • CS8942: 挿入文字列ハンドラー メソッドに一貫性のない戻り値の型があります。別の型を返す必要があります。
  • CS8946: 型は挿入文字列ハンドラー型ではありません。
  • CS8947: パラメーターは、 パラメーター リスト内の挿入文字列ハンドラー パラメーターの後に発生しますが、挿入文字列ハンドラー変換の引数として使用されます。これにより、呼び出し元は、呼び出しサイトで名前付き引数を持つパラメーターを並べ替える必要があります。関係するすべての引数の後に挿入文字列ハンドラー パラメーターを配置することを検討してください。
  • CS8953: 挿入文字列ハンドラーの構築では、動的を使用できません。代わりにインスタンスを手動で構築します。
  • CS8976: インデックスが作成されているインスタンスを参照する挿入文字列ハンドラー変換は、インデクサー メンバー初期化子では使用できません。
  • CS9205: 補間文字列が必要です。
  • CS9325: 挿入文字列ハンドラー引数は、このコンテキストでは使用できません。

補間式の構文

  • CS8361 - 条件式を文字列補間で直接使用することはできません。これは、':' によって補間が終了するためです。条件式をかっこで変更します。
  • CS9205 - 期待される挿入文字列。

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

  • 補間ホール (?:) 内で条件式を使用する場合は、条件式 (三項演算子) をかっこで囲みます。 コロン文字は書式指定文字列を導入するため、挿入文字列では特別な意味を持つため、コンパイラは:condition ? true : falseを条件付き式の一部ではなく書式指定子として解釈します。 たとえば、$"{(x > 0 ? "positive" : "negative")}" の代わりに $"{x > 0 ? "positive" : "negative"}" を使用します。
  • 必ず、予期される補間文字列リテラル (CS9205) を指定してください。 このエラーは、コンパイラが挿入文字列 ( $" または $@" で始まる) を予期しているが、別の式の型が発生した場合に発生します。

挿入文字列ハンドラー型の実装

  • CS8941 - 挿入文字列ハンドラー メソッドの形式が正しくありません。'void' または 'bool' は返されません。
  • CS8942 - 挿入文字列ハンドラー メソッドの戻り値の型が一貫性がありません。別の型を返す必要があります。
  • CS8946 - 型は挿入文字列ハンドラー型ではありません。

カスタム 補間文字列ハンドラーを実装する場合は、次の手法を適用します。

  • すべての AppendLiteral メソッドと AppendFormatted メソッドが void または bool (CS8941) を返すようにします。 ハンドラー パターンでは、コンパイラが補間コードを適切に生成できるように、これらのメソッドにこれらの戻り値の型のいずれかを指定する必要があります。 boolを返すメソッドは、ハンドラーがそれ以上の処理が必要でないと判断したときにショートサーキットを有効にします。
  • ハンドラー型のすべての追加メソッドで同じ戻り値の型 (CS8942) が使用されていることを確認します。 1 つのメソッドが voidを返す場合、すべての追加メソッドは voidを返す必要があります。 1 つが boolを返す場合は、すべてが boolを返す必要があります。 戻り値の型を混在すると、コンパイラは一貫性のある補間コードを生成できなくなります。
  • ハンドラー型に InterpolatedStringHandlerAttribute を適用し、有効なコンストラクター (CS8946) があることを確認します。 挿入文字列ハンドラー型は、この属性でマークし、コンパイラによって認識される ハンドラー パターン に従う必要があります。

挿入文字列ハンドラーの使用制限

  • CS8947 - パラメーターは、パラメーター リストの挿入文字列ハンドラー パラメーターの後に発生しますが、挿入文字列ハンドラー変換の引数として使用されます。これにより、呼び出し元は、呼び出しサイトで名前付き引数を持つパラメーターを並べ替える必要があります。関係するすべての引数の後に挿入文字列ハンドラー パラメーターを配置することを検討してください。
  • CS8953 - 挿入文字列ハンドラーの構築では、動的を使用できません。'{0}' のインスタンスを手動で構築します。
  • CS8976 - インデックスが作成されているインスタンスを参照する挿入文字列ハンドラー変換は、インデクサー メンバー初期化子では使用できません。
  • CS9325 - 挿入文字列ハンドラー引数は、このコンテキストでは使用できません。

挿入文字列ハンドラーを使用する場合は、次の手法を適用します。

  • 挿入文字列ハンドラー パラメーター (InterpolatedStringHandlerArgumentAttribute) の前にで使用されるすべてのパラメーターが表示されるように、メソッド パラメーターを並べ替えます。 この警告は、呼び出し元がメソッドを適切に呼び出すために名前付き引数を使用する必要があることを示します。これにより、使いやすさが低下します。 依存するすべての引数の後にハンドラー パラメーターを配置します。
  • 挿入文字列ハンドラー変換の引数として dynamic 型指定された値を使用しないでください (CS8953)。 コンパイラは、動的な値が関係するコンパイル時にハンドラーの構築要件を判断できません。 代わりに、ハンドラー インスタンスを手動で構築し、そのメソッドを直接呼び出します。
  • インデクサー メンバー初期化子 (CS8976) で初期化されているインスタンスを参照する挿入文字列は使用しないでください。 オブジェクトの初期化中、インスタンスは完全には構築されていないため、 this を介してそれを参照するハンドラー変換は許可されません。 初期化後に別のステートメントを使用して、インデクサー値を設定します。
  • 挿入文字列ハンドラー引数 (CS9325) を使用しているコンテキストを確認します。 一部のコンテキストでは、ハンドラー引数属性がサポートされていません。 このような場合は、通常の補間文字列を使用するか、ハンドラーを手動で構築します。