次の方法で共有


ソース ジェネレーターとインターセプターに関連するエラーと警告

コンパイル中にソース ジェネレーターまたはインターセプターが読み込まれると、次のエラーが生成されます。

  • CS9137: "インターセプター" 実験機能が有効になっていません。プロジェクトに <Features>InterceptorsPreview</Features> を追加します。
  • CS9138: メソッドまたはその包含型には型パラメーターがあるため、インターセプターとして使用できません。
  • CS9139: インターセプトできません: コンパイルにパスを含むファイルが含まれていません。
  • CS9140: インターセプトできません: コンパイルにパスを含むファイルが含まれていません。別のパスを使用するつもりでしたか?
  • CS9141: 指定された行と文字番号は、インターセプト可能なメソッド名ではなく、トークンを参照します。
  • CS9142: 指定されたファイルに n 行があり、指定された行番号 mよりも少なくなります。
  • CS9143: 指定された行が c 文字の長さであり、指定された文字番号 nよりも少なくなります。
  • CS9144: シグネチャが一致しないため、インターセプター MでメソッドVをインターセプトできません。
  • CS9145: インターセプトできません: パスがマップ解除されています。マップされたパスが必要です。
  • CS9146: インターセプター メソッドは通常のメンバー メソッドである必要があります。
  • CS9147: 指定された行と文字番号は、トークンの先頭を参照しません。行 n と文字 cを使用するつもりでしたか?
  • CS9148: インターセプターには、パラメーターに一致する this パラメーターが必要です。
  • CS9149: メソッドに this パラメーターがないため、インターセプターに this パラメーターを指定することはできません。
  • CS9150: インターセプターは、 null ファイル パスを持つことはできません。
  • CS9151: メソッド名 M 呼び出されていないため、インターセプトできません。
  • CS9152: コンパイル内の複数のファイルにこのパスがあるため、このパスでファイル内の呼び出しをインターセプトできません。
  • CS9153: 指定された呼び出しが複数回インターセプトされます。
  • CS9155: M内でアクセスできないため、Vで呼び出しをインターセプトできません。
  • CS9156: 'scoped' 修飾子またはM属性の違いにより、Vを使用して[UnscopedRef]の呼び出しをインターセプトできません。
  • CS9157: InterceptsLocationAttributeに指定する行番号と文字番号は正である必要があります。
  • CS9160: nameof 演算子をインターセプトできません。
  • CS9161: インターセプターを UnmanagedCallersOnlyAttributeでマークすることはできません。
  • CS9177: インターセプターは非ジェネリックであるか、一致するアリティを持っている必要があります。
  • CS9178: 一致させるには、メソッドが非ジェネリックである必要があります
  • CS9206: インターセプターをグローバル名前空間で宣言することはできません。
  • CS9207: メソッドは通常のメンバー メソッドの呼び出しではないため、インターセプトできません。
  • CS9231: InterceptsLocationAttribute のデータ引数が正しい形式ではありません。
  • CS9232: インターセプター形式のバージョン 'version' はサポートされていません。サポートされている最新バージョンは '1' です。
  • CS9233: コンパイル内の他の場所で重複しているため、ファイル 'file' の呼び出しをインターセプトできません。
  • CS9234: コンパイルで一致するファイルが見つからなかったため、ファイル 'file' の呼び出しをインターセプトできません。
  • CS9235: InterceptsLocationAttribute のデータ引数は、ファイル 'file' 内の無効な位置を参照します。

コンパイル中にソース ジェネレーターまたはインターセプターが読み込まれると、次の警告が生成されます。

  • CS8784: ジェネレーター 'YourSourceGeneratorName' の初期化に失敗しました。出力には影響せず、結果としてコンパイル エラーが発生する可能性があります。
  • CS8785: ジェネレーター 'YourSourceGeneratorName' がソースの生成に失敗しました。出力には影響せず、結果としてコンパイル エラーが発生する可能性があります。
  • CS9057: アナライザー アセンブリは、現在実行中のバージョンよりも新しいバージョンのコンパイラを参照しているため、使用できません。
  • CS9067: アナライザー参照が複数回指定されました。
  • CS9154: インターセプター Mを使用してVの呼び出しをインターセプトしますが、署名が一致しません。
  • CS9158: 戻り値の型での参照型の Null 許容がインターセプト可能なメソッドと一致しません。
  • CS9159: パラメーターの型での参照型の Null 許容がインターセプト可能なメソッドと一致しません。
  • CS9270: 'InterceptsLocationAttribute(string, int, int)' はサポートされていません。代わりに、これらの属性の 'InterceptableLocation' ベースの生成に移動します。 (https://github.com/dotnet/roslyn/issues/72133)

これらのエラーと警告は、次のテーマに従います。

インターセプターは試験的

  • CS9137: "インターセプター" 実験機能が有効になっていません。プロジェクトに <Features>InterceptorsPreview</Features> を追加します。

インターセプターを使用するには、<Features>InterceptorsPreview</Features> セクション (<PropertyGroup>) 内のプロジェクト ファイルに要素を追加します。インターセプターは、既定では有効になっていない試験段階の機能であるためです。 この明示的なオプトインは、インターセプター機能が今後のリリースで破壊的変更または削除の影響を受ける可能性があり、コンパイラが使用を許可する前にリスクを理解していることを確認する必要があるために必要です。 インターセプターとその機能の詳細については、C# 12 の機能に関するドキュメントの インターセプター を参照してください。

署名の不一致

次のエラーと警告は、インターセプター メソッドとインターセプト可能なメソッドの間の不一致を示しています。

  • CS9144: シグネチャが一致しないため、インターセプター MでメソッドVをインターセプトできません。
  • CS9148: インターセプターには、パラメーターに一致する this パラメーターが必要です。
  • CS9149: インターセプターには、this パラメーターがないため、this パラメーターを持つ必要はありません。
  • CS9155: M内でアクセスできないため、Vで呼び出しをインターセプトできません。
  • CS9156: 'scoped' 修飾子またはM属性の違いにより、V[UnscopedRef]の呼び出しをインターセプトできません。
  • CS9177]: インターセプターは非ジェネリックであるか、一致するアリティを持っている必要があります。
  • CS9178: 一致させるには、メソッドが非ジェネリックである必要があります

さらに、次の警告は、インターセプターとインターセプト可能なメソッドのシグネチャの不一致を示しています。

  • CS9154: インターセプター Mを使用してVの呼び出しをインターセプトしますが、署名が一致しません。
  • CS9158: 戻り値の型での参照型の Null 許容がインターセプト可能なメソッドと一致しません。
  • CS9159: パラメーターの型での参照型の Null 許容がインターセプト可能なメソッドと一致しません。
  • CS9270: 'InterceptsLocationAttribute(string, int, int)' はサポートされていません。代わりに、これらの属性の 'InterceptableLocation' ベースの生成に移動します。 (https://github.com/dotnet/roslyn/issues/72133)

これらの問題を修正するには、インターセプター メソッドがインターセプト可能なメソッドのシグネチャとアクセスの要件と一致していることを確認します。

  • インターセプター メソッドシグネチャがインターセプト可能なメソッド (CS9144CS9154) と正確に一致していることを確認します。 パラメーターの型、修飾子、順序、戻り値の型は同じである必要があります。 両方のメソッド宣言を確認し、シグネチャを調整します。
  • インターセプト可能なメソッドがインスタンス メソッド (this) の場合は、インターセプターに パラメーターを追加するか、インターセプト可能なメソッドが静的な場合は this パラメーターを削除します (CS9149)。 インスタンス インターセプターには宣言型の this パラメーターが必要ですが、静的インターセプターにはパラメーターを含めてはなりません。
  • インターセプターは、インターセプト可能なメソッドにアクセスできる場所 (CS9155) で宣言します。 インターセプト可能なメソッドが internal場合、インターセプターは同じアセンブリ内にある必要があります。 privateの場合、インターセプターは同じ型または入れ子になった型である必要があります。
  • 対応するscoped パラメーター ([UnscopedRef]) 上の ref 修飾子と 属性を一致させます。 インターセプター内の各 ref パラメーターには、メモリの安全性を確保するために、インターセプト可能なメソッドの対応するパラメーターと同じ有効期間注釈が必要です。
  • 両方のメソッドに一致するジェネリック アリティ (CS9177CS9178) があることを確認します。 インターセプト可能なメソッドが非ジェネリックの場合、インターセプターも非ジェネリックである必要があります。 インターセプト可能なメソッドに型パラメーターがある場合、インターセプターは互換性のある制約を持つ同じ数の型パラメーターを持つ必要があります。
  • 戻り値の型 (CS9158) とパラメーター型 (CS9159) の null 許容注釈を一致させてください。 プロジェクトで null 許容参照型を有効にし、インターセプターの null 許容注釈がインターセプト可能なメソッドと正確に一致するようにして、型の安全性を維持します。
  • 非推奨のInterceptableLocation コンストラクター (InterceptsLocationAttribute) ではなく、更新された(string, int, int)ベースの生成をに使用します。 新しい形式では、ツールのサポートとコンパイル時の検証が向上します。 移行ガイダンスについては、 GitHub の問題 を参照してください。

不適切なマッピング

インターセプターには、インターセプト可能なメソッドとインターセプター メソッドをマップするソース マッピングが必要です。 次のエラーは、マッピングに関する問題を示しています。

  • CS9139: インターセプトできません: コンパイルにパスを含むファイルが含まれていません。
  • CS9140: インターセプトできません: コンパイルにパスを含むファイルが含まれていません。別のパスを使用するつもりでしたか?
  • CS9141: 指定された行と文字番号は、インターセプト可能なメソッド名ではなく、トークンを参照します。
  • CS9142: 指定されたファイルに n 行があり、指定された行番号 mよりも少なくなります。
  • CS9143: 指定された行が c 文字の長さであり、指定された文字番号 nよりも少なくなります。
  • CS9145: インターセプトできません: パスがマップ解除されています。マップされたパスが必要です。
  • CS9147: 指定された行と文字番号は、トークンの先頭を参照しません。行 n と文字 cを使用するつもりでしたか?
  • CS9150: インターセプターは、 null ファイル パスを持つことはできません。
  • CS9157: InterceptsLocationAttributeに指定する行番号と文字番号は正である必要があります。

マッピング エラーを修正するには、 InterceptsLocationAttribute に有効なファイル パスと正確な位置情報が含まれていることを確認します。

  • ファイル パスがコンパイル内のファイルと正確に一致するかどうかを確認します (CS9139CS9140)。 正しい大文字と小文字の区別やディレクトリ区切り記号など、プロジェクトに表示される正確なパスを使用します。 コンパイラが代替パスを提案する場合は、そのパスを使用するように属性を更新します。
  • ファイル パスを変換するソース ジェネレーターを使用する場合は、マップされたファイル パスを使用します (CS9145)。 ソース ジェネレーターは、多くの場合、生成されたファイルのパスを再マップします。また、元のソース パスではなく、コンパイラが認識するマップされたパスを使用する必要があります。
  • ファイル パスがnullでないことをInterceptsLocationAttribute (CS9150) で確認します。 インターセプトのたびに、インターセプトの呼び出しを含むソース ファイルを識別する有効な null 以外のファイル パスを指定する必要があります。
  • 正の 1 から始まる行番号と文字番号を指定します (CS9157)。 行番号と文字位置は、0 ではなく 1 から始まる必要があります。 位置を計算するときに、ソース ジェネレーターで 1 ベースのインデックス作成が使用されていることを確認します。
  • メソッド名トークン CS9141CS9147 の正確な開始位置を示します。 行番号と文字番号は、空白、演算子、またはその他のトークンではなく、呼び出しのメソッド名の最初の文字を識別する必要があります。 コンパイラが代替座標を提案する場合は、それらを使用して正しいトークンの開始をターゲットにします。
  • ファイルの境界内 (CS9142CS9143) 内に留めます。 行番号が合計行数を超えていないことを確認し、文字数が行の長さを超えていないことを確認します。 属性が生成されてからソース ファイルが変更された場合は、位置を再計算します。

インターセプター宣言が正しくありません

次のエラーは、インターセプター宣言の問題 ( InterceptsLocationAttribute 形式の問題やインターセプター 規則の違反など) を示しています。

  • CS9138: メソッドまたはその包含型には型パラメーターがあるため、インターセプターとして使用できません。
  • CS9146: インターセプター メソッドは通常のメンバー メソッドである必要があります。
  • CS9151: メソッド名 M 呼び出されていないため、インターセプトできません。
  • CS9152: コンパイル内の複数のファイルにこのパスがあるため、このパスでファイル内の呼び出しをインターセプトできません。
  • CS9153: 指定された呼び出しが複数回インターセプトされます。
  • CS9160: nameof 演算子をインターセプトできません。
  • CS9161: インターセプターを UnmanagedCallersOnlyAttributeでマークすることはできません。
  • CS9206: インターセプターをグローバル名前空間で宣言することはできません。
  • CS9207: メソッドは通常のメンバー メソッドの呼び出しではないため、インターセプトできません。
  • CS9231: InterceptsLocationAttribute のデータ引数が正しい形式ではありません。
  • CS9232: インターセプター形式のバージョン 'version' はサポートされていません。サポートされている最新バージョンは '1' です。
  • CS9233: コンパイル内の他の場所で重複しているため、ファイル 'file' の呼び出しをインターセプトできません。
  • CS9234: コンパイルで一致するファイルが見つからなかったため、ファイル 'file' の呼び出しをインターセプトできません。
  • CS9235: InterceptsLocationAttribute のデータ引数は、ファイル 'file' 内の無効な位置を参照します。

インターセプター宣言エラーを修正するには、有効なインターセプター宣言と InterceptsLocationAttribute 使用に関する次の規則に従います。

  • InterceptsLocationAttributeデータ引数を正しく書式設定します (CS9231)。 この属性には、ファイル パスと位置情報をエンコードする、具体的に構造化されたデータが必要です。 ソース ジェネレーターが、現在のインターセプター仕様に一致する予想される形式でデータを生成することを確認します。
  • InterceptsLocationAttribute (CS9232) でバージョン '1' を使用します。これは、サポートされている最新のバージョンであるためです。 ソース ジェネレーターを、サポートされていないバージョン番号ではなく、バージョン 1 形式の属性を出力するように更新します。
  • コンパイルで一意のファイル パス (CS9233CS9234) を確認します。 コンパイルに重複するファイル パスが含まれている場合は、ファイルの名前を変更または再構成して、各パスを一意にします。 属性内のファイル パスが、コンパイルに実際に含まれるファイルと一致することを確認します。
  • 有効なコードの場所 (CS9235) に位置データ点を検証します。 行番号と文字番号は、指定されたファイル内の有効なインターセプト・ポイントを参照する必要があります。 ソース ファイルが変更された場合、または位置がファイルの境界外にある場合は、属性を再生成します。
  • 非ジェネリック型 (CS9138) で非ジェネリック インターセプター メソッドを宣言します。 インターセプターは、メソッド自体またはその包含型に対して型パラメーターを持つことはありません。 ジェネリック メソッドをインターセプトする必要がある場合は、特定の構築された型で動作する非ジェネリック インターセプターを作成します。
  • インターセプターを通常のメンバー メソッド (CS9146) にします。 インターセプターは、演算子、コンストラクター、ファイナライザー、プロパティ、またはインデクサーにすることはできません。 インターセプターを通常の静的メソッドまたはインスタンス メソッドとして宣言します。
  • 式ではなく、実際のメソッド呼び出しをインターセプトします (CS9151CS9207)。 呼び出される通常のメンバー メソッドの呼び出しのみをインターセプトできます。 呼び出されずに参照されるメソッド グループ、デリゲート、またはメソッドをインターセプトすることはできません。 インターセプト可能な場所が実際のメソッド呼び出しを識別していることを確認します。
  • 重複するインターセプト試行を削除します (CS9153)。 各メソッド呼び出しは 1 回しかインターセプトできません。 複数の InterceptsLocationAttribute インスタンスが同じ呼び出しを対象としている場合は、1 つを除くすべてを削除してあいまいさを解決します。
  • nameof演算子 (CS9160) をインターセプトしないでください。 nameof演算子は実行時にメソッドを呼び出さないため、インターセプトできません。 実行時に実行される実際のメソッド呼び出しのみをインターセプトします。
  • インターセプターから UnmanagedCallersOnlyAttribute を削除します (CS9161)。 インターセプターはマネージド コードから呼び出すことができる必要があり、 UnmanagedCallersOnlyAttributeでマークすることはできません。 インターセプター メソッドの宣言から属性を削除します。
  • 名前空間内でインターセプターを宣言します (CS9206)。 インターセプターはグローバル名前空間で宣言できないため、少なくとも 1 つの名前空間宣言内に含まれている必要があります。 インターセプター クラスを名前空間にラップします。
  • コンパイル レベル (CS9152) で重複するファイル パスを解決します。 コンパイルで複数のファイルが同じパスを共有している場合、コンパイラはインターセプトするファイルを判断できません。 ビルド構成で一意のファイル パスが生成されるようにするか、ソース ファイルに別の組織戦略を使用します。

アナライザーの互換性

次の警告は、アナライザーまたはソース ジェネレーター アセンブリに関する問題を示しています。

  • CS9057: アナライザー アセンブリは、現在実行中のバージョンよりも新しいバージョンのコンパイラを参照しているため、使用できません。
  • CS9067: アナライザー参照が複数回指定されました。

これらの警告は、アナライザー アセンブリに互換性の問題がある場合に発生します。

  • CS9057 は、アナライザー アセンブリが現在実行中のバージョンよりも新しい Roslyn コンパイラのバージョンを参照すると生成されます。 これにより、アナライザーは、API または現在のコンパイラ バージョンで使用できない動作に依存する可能性があるため、読み込みができなくなります。 これを解決するには、アナライザーの要件に合わせてコンパイラ/SDK をアップグレードするか、現在のコンパイラ バージョンと互換性のあるバージョンのアナライザーを使用します。
  • CS9067 は、同じアナライザー アセンブリがプロジェクト内で複数回参照されると警告します。 これは通常、アナライザーが複数のパスまたはパッケージ参照を介して含まれている場合に発生します。 エラーではありませんが、重複する参照はビルドのパフォーマンスに影響を与え、予期しない動作を引き起こす可能性があります。 この警告を解決するには、重複する参照を削除します。