Freigeben über


Fehler und Warnungen im Zusammenhang mit Quellgeneratoren und Interceptors

Die folgenden Fehler werden generiert, wenn Quellgeneratoren oder Interceptors während einer Kompilierung geladen werden:

  • CS9137: Das experimentelle Feature "Interceptors" ist nicht aktiviert. Fügen Sie <Features>InterceptorsPreview</Features> zu Ihrem Projekt hinzu.
  • CS9138: Die Methode kann nicht als Interceptor verwendet werden, da sie oder der enthaltende Typ Typparameter aufweist.
  • CS9139: Die Kompilierung kann nicht abfangen: Die Kompilierung enthält keine Datei mit Pfad.
  • CS9140: Die Kompilierung kann nicht abgefangen werden: Die Kompilierung enthält keine Datei mit Pfad. Bedeuteten Sie, einen anderen Pfad zu verwenden?
  • CS9141: Die angegebene Zeilen- und Zeichennummer verweist nicht auf einen namen der abfangenden Methoden, sondern auf ein Token.
  • CS9142: Die angegebene Datei enthält n Zeilen, die kleiner als die angegebene Zeilennummer msind.
  • CS9143: Die angegebene Zeile ist c Zeichen lang, was weniger als die angegebene Zeichenanzahl n ist.
  • CS9144: Die Methode M kann nicht mit dem Interceptor V abgefangen werden, da die Signaturen nicht übereinstimmen.
  • CS9145: Der Pfad kann nicht verarbeitet werden: Nicht zugeordnet. Erwarteter zugeordneter Pfad.
  • CS9146: Eine Interceptor-Methode muss eine normale Membermethode sein.
  • CS9147: Die angegebene Zeile und die angegebene Zeichennummer beziehen sich nicht auf den Anfang eines Tokens. Meinten Sie, Zeile n und Zeichen c zu verwenden?
  • CS9148: Interceptor muss über einen this Parameterabgleichsparameter verfügen.
  • CS9149: Interceptor darf keinen Parameter haben this , da die Methode keinen Parameter hat this .
  • CS9150: Interceptor kann keinen Dateipfad haben null .
  • CS9151: Der mögliche Methodenname M kann nicht abgefangen werden, da er nicht aufgerufen wird.
  • CS9152: Ein Aufruf in der Datei mit diesem Pfad kann nicht abgefangen werden, da mehrere Dateien in der Kompilierung diesen Pfad aufweisen.
  • CS9153: Der angegebene Aufruf wird mehrmals abgefangen.
  • CS9155: Der Anruf kann mit M nicht abgefangen werden, da er innerhalb von V nicht zugänglich ist.
  • CS9156: Der Aufruf zu M mit V kann aufgrund eines Unterschieds bei bereichsbezogenen Modifizierern oder [UnscopedRef]-Attributen nicht abgefangen werden.
  • CS9157: Zeilen- und Zeichennummern, die an InterceptsLocationAttribute übergeben werden, müssen positiv sein.
  • CS9160: Ein Nameofoperator kann nicht abgefangen werden.
  • CS9161: Ein Interceptor kann nicht mit UnmanagedCallersOnlyAttributemarkiert werden.
  • CS9177: Interceptor muss entweder nicht generisch sein oder eine übereinstimmende Arität haben.
  • CS9178: Methode muss nicht generisch sein, damit sie übereinstimmen
  • CS9206: Ein Interceptor kann nicht im globalen Namespace deklariert werden.
  • CS9207: Kann nicht abfangen, da die Methode kein Aufruf einer normalen Membermethode ist.
  • CS9231: Das Datenargument "InterceptsLocationAttribute" weist nicht das richtige Format auf.
  • CS9232: Version 'version' des Interceptor-Formats wird nicht unterstützt. Die neueste unterstützte Version ist '1'.
  • CS9233: Ein Aufruf in der Datei "Datei" kann nicht abgefangen werden, da er an anderer Stelle in der Kompilierung dupliziert wird.
  • CS9234: Ein Aufruf in der Datei "Datei" kann nicht abgefangen werden, da in der Kompilierung keine übereinstimmende Datei gefunden wurde.
  • CS9235: Das Datenargument "InterceptsLocationAttribute" verweist auf eine ungültige Position in der Datei "Datei".

Die folgenden Warnungen werden generiert, wenn Quellgeneratoren oder Interceptors während einer Kompilierung geladen werden:

  • CS8784: Generator 'YourSourceGeneratorName' konnte nicht initialisiert werden. Er wird nicht zur Ausgabe beitragen, und es können dadurch Kompilierungsfehler auftreten.
  • CS8785: Der Generator "YourSourceGeneratorName" konnte die Quelle nicht generieren. Er wird nicht zum Output beitragen, was zu Kompilierungsfehlern führen kann.
  • CS9057: Analyzer-Assembly kann nicht verwendet werden, da sie auf eine neuere Version des Compilers verweist als auf die derzeit ausgeführte Version.
  • CS9067: Analysereferenz wurde mehrmals angegeben.
  • CS9154: Abfangen eines Anrufs M mit Interceptor V, die Signaturen stimmen jedoch nicht überein.
  • CS9158: Die Nullierbarkeit von Verweistypen im Rückgabetyp stimmt nicht mit der abfangenden Methode überein.
  • CS9159: Die Nullierbarkeit von Verweistypen im Parametertyp stimmt nicht mit der abfangenden Methode überein.
  • CS9270: 'InterceptsLocationAttribute(string, int, int)' wird nicht unterstützt. Wechseln Sie stattdessen zu "InterceptableLocation"-basierten Generierung dieser Attribute. (https://github.com/dotnet/roslyn/issues/72133)

Diese Fehler und Warnungen folgen diesen Themen:

Interceptors sind experimentelle Geräte

  • CS9137: Das experimentelle Feature "Interceptors" ist nicht aktiviert. Zu Ihrem Projekt hinzufügen <Features>InterceptorsPreview</Features> .

Um Interceptors zu verwenden, fügen Sie das <Features>InterceptorsPreview</Features> Element ihrer Projektdatei in einem <PropertyGroup> Abschnitt (CS9137) hinzu, da Interceptors ein experimentelles Feature sind, das standardmäßig nicht aktiviert ist. Diese explizite Zustimmung ist erforderlich, da das Interceptors-Feature in zukünftigen Versionen Änderungen unterliegen oder entfernt werden kann. Der Compiler benötigt eine Bestätigung, dass Sie die Risiken verstehen, bevor er die Verwendung zulässt. Weitere Informationen zu Interceptors und ihren Funktionen finden Sie in der C# 12-Featuredokumentation.

Nichtübereinstimmung der Signatur

Die folgenden Fehler und Warnungen deuten auf eine Diskrepanz zwischen der Interceptor-Methode und der abfangbaren Methode hin.

  • CS9144: Die Methode M kann nicht mit dem Interceptor V abgefangen werden, da die Signaturen nicht übereinstimmen.
  • CS9148: Interceptor muss über einen this Parameterabgleichsparameter verfügen.
  • CS9149: Interceptor darf keinen Parameter haben this , da die Methode keinen Parameter hat this .
  • CS9155: Der Aufruf kann nicht M abgefangen werden, weil er innerhalb von V nicht zugänglich ist.
  • CS9156: Anruf an M kann nicht mit V abgefangen werden, da ein Unterschied bei 'Scope'-Modifizierern oder [UnscopedRef] Attributen besteht.
  • CS9177]: Interceptor muss entweder nicht generisch sein oder über übereinstimmende Arität verfügen.
  • CS9178: Methode muss nicht generisch sein, damit sie übereinstimmen

Darüber hinaus weisen die folgenden Warnungen auf ein Missverhältnis in den Signaturen des Interceptors und der abfangbaren Methode hin.

  • CS9154: Abfangen eines Aufrufs an M mit dem Interceptor V, jedoch stimmen die Signaturen nicht überein.
  • CS9158: Die Nullierbarkeit von Verweistypen im Rückgabetyp stimmt nicht mit der abfangenden Methode überein.
  • CS9159: Die Nullierbarkeit von Verweistypen im Parametertyp stimmt nicht mit der abfangenden Methode überein.
  • CS9270: 'InterceptsLocationAttribute(string, int, int)' wird nicht unterstützt. Wechseln Sie stattdessen zu "InterceptableLocation"-basierten Generierung dieser Attribute. (https://github.com/dotnet/roslyn/issues/72133)

Um diese Probleme zu beheben, stellen Sie sicher, dass die Interceptor-Methode den Signatur- und Zugriffsanforderungen der abfangenden Methode entspricht:

  • Stellen Sie sicher, dass die Interceptor-Methodensignatur exakt mit der abfangenden Methode übereinstimmt (CS9144, CS9154). Die Parametertypen, Modifizierer, Reihenfolge und Rückgabetyp müssen identisch sein. Überprüfen Sie beide Methodendeklarationen, und richten Sie ihre Signaturen aus.
  • Fügen Sie dem Interceptor einen this Parameter hinzu, wenn es sich bei der abfangbaren Methode um eine Instanzmethode (CS9148) handelt, oder entfernen Sie den this Parameter, wenn die abfangende Methode statisch ist (CS9149). Instanzinterceptoren erfordern einen this Parameter des deklarierenden Typs, während statische Interceptoren keinen haben dürfen.
  • Deklarieren Sie den Interceptor an einer Position, an der auf die abfangbare Methode zugegriffen werden kann (CS9155). Wenn die abfangbare Methode lautet internal, muss sich der Interceptor in derselben Assembly befinden. Wenn es private ist, muss sich der Interceptor im selben Typ oder einem geschachtelten Typ befinden.
  • Stimmen Sie die scoped Modifizierer und [UnscopedRef] Attribute auf entsprechende ref Parameter ab (CS9156). Jeder ref Parameter im Interceptor muss dieselben Lebensdaueranmerkungen aufweisen wie der entsprechende Parameter in der abfangenden Methode, um die Speichersicherheit sicherzustellen.
  • Stellen Sie sicher, dass beide Methoden eine übereinstimmende generische Arität aufweisen (CS9177, CS9178). Wenn die abfangbare Methode nicht generisch ist, muss der Interceptor auch nicht generisch sein. Wenn die abfangende Methode Typparameter aufweist, muss der Interceptor dieselbe Anzahl von Typparametern mit kompatiblen Einschränkungen aufweisen.
  • Übereinstimmung mit den Nullbarkeitsanmerkungen im Rückgabetyp (CS9158) und Parametertypen (CS9159). Aktivieren Sie nullable Referenztypen in Ihrem Projekt, und stellen Sie sicher, dass die Nullbarkeitsanmerkungen des Interceptors exakt mit der abfangbaren Methode übereinstimmen, um die Typsicherheit zu gewährleisten.
  • Verwenden Sie die aktualisierte InterceptableLocation-basierte Generation für InterceptsLocationAttribute statt des veralteten (string, int, int) Konstruktors (CS9270). Das neuere Format bietet eine bessere Toolunterstützung und Kompilierungszeitüberprüfung. Sehen Sie sich das GitHub-Issue für den Migrationsleitfaden an.

Falsche Zuordnung

Interceptors erfordern eine Quellabbildung, die die abfangbare Methode und die Interceptor-Methode verknüpft. Die folgenden Fehler deuten auf ein Problem mit der Zuordnung hin:

  • CS9139: Die Kompilierung kann nicht abfangen: Die Kompilierung enthält keine Datei mit Pfad.
  • CS9140: Die Kompilierung kann nicht abgefangen werden: Die Kompilierung enthält keine Datei mit Pfad. Bedeuteten Sie, einen anderen Pfad zu verwenden?
  • CS9141: Die angegebene Zeilen- und Zeichennummer verweist nicht auf einen namen der abfangenden Methoden, sondern auf ein Token.
  • CS9142: Die angegebene Datei enthält n Zeilen, die kleiner als die angegebene Zeilennummer msind.
  • CS9143: Die angegebene Zeile ist c lang, die weniger als die angegebene Zeichennummer nist.
  • CS9145: Interzeptieren nicht möglich: Der Pfad ist nicht zugeordnet. Zugeordneter Pfad erwartet.
  • CS9147: Die angegebene Zeilen- und Zeichennummer beziehen sich nicht auf den Beginn eines Tokens. Meinten Sie, Zeile n und Zeichen c zu verwenden?
  • CS9150: Interceptor kann keinen Dateipfad haben null .
  • CS9157: Den InterceptsLocationAttribute übermittelte Zeilen- und Zeichennummern müssen positiv sein.

Um Zuordnungsfehler zu beheben, stellen Sie sicher, dass Sie InterceptsLocationAttribute gültige Dateipfade und genaue Positionsinformationen enthalten:

  • Überprüfen Sie, ob der Dateipfad genau mit einer Datei in Ihrer Kompilierung übereinstimmt (CS9139, CS9140). Verwenden Sie den genauen Pfad, wie er in Ihrem Projekt angezeigt wird, einschließlich korrekter Groß- und Kleinschreibung und Verzeichnistrennzeichen. Wenn der Compiler einen alternativen Pfad vorschlägt, aktualisieren Sie Ihr Attribut so, dass er diesen Pfad verwendet.
  • Verwenden Sie zugeordnete Dateipfade beim Arbeiten mit Quellgeneratoren, die Dateipfade transformieren (CS9145). Quellgeneratoren ordnen häufig Pfade für generierte Dateien neu zu, und Sie müssen den zugeordneten Pfad verwenden, den der Compiler erkennt, nicht den ursprünglichen Quellpfad.
  • Stellen Sie sicher, dass sich der Dateipfad nicht null in Ihrem InterceptsLocationAttribute (CS9150) befindet. Jedes Abfangen muss einen gültigen, nicht null-Dateipfad angeben, der die Quelldatei identifiziert, die den abzufangenden Aufruf enthält.
  • Stellen Sie positive, 1-basierte Zeilen- und Zeichenzahlen bereit (CS9157). Zeilennummern und Zeichenpositionen müssen bei 1 beginnen, nicht bei 0. Überprüfen Sie, ob der Quellgenerator beim Berechnen von Positionen eine 1-basierte Indizierung verwendet.
  • Zeigen Sie auf den genauen Start des Methodennamentokens (CS9141, CS9147). Die Zeilen- und Zeichennummern müssen das erste Zeichen des Methodennamens im Aufruf identifizieren, nicht Leerzeichen, Operatoren oder andere Token. Wenn der Compiler alternative Koordinaten vorschlägt, verwenden Sie diese, um auf den richtigen Tokenstart anzusteuern.
  • Bleiben Sie innerhalb der Grenzen der Datei (CS9142, CS9143). Überprüfen Sie, ob die Zeilennummer die Gesamtzahl der Zeilen nicht überschreitet, und die Zeichennummer überschreitet nicht die Zeilenlänge. Berechnen Sie Positionen neu, wenn sich die Quelldatei seit dem Generieren des Attributs geändert hat.

Falsche Interceptordeklaration

Die folgenden Fehler deuten auf Probleme mit Interceptordeklarationen hin, einschließlich Problemen mit dem InterceptsLocationAttribute Format oder Verstößen gegen Interceptor-Regeln:

  • CS9138: Die Methode kann nicht als Interceptor verwendet werden, da sie oder der enthaltende Typ Typparameter aufweist.
  • CS9146: Eine Interceptor-Methode muss eine gewöhnliche Membermethode sein.
  • CS9151: Der mögliche Methodenname M kann nicht abgefangen werden, da er nicht aufgerufen wird.
  • CS9152: Ein Aufruf in der Datei mit diesem Pfad kann nicht abgefangen werden, da mehrere Dateien in der Kompilierung diesen Pfad aufweisen.
  • CS9153: Der angegebene Aufruf wird mehrmals abgefangen.
  • CS9160: Ein Nameofoperator kann nicht abgefangen werden.
  • CS9161: Ein Interceptor kann nicht mit UnmanagedCallersOnlyAttributemarkiert werden.
  • CS9206: Ein Interceptor kann nicht im globalen Namespace deklariert werden.
  • CS9207: Kann nicht abfangen, da die Methode kein Aufruf einer normalen Membermethode ist.
  • CS9231: Das Datenargument "InterceptsLocationAttribute" weist nicht das richtige Format auf.
  • CS9232: Version "Version" des Interceptors-Formats wird nicht unterstützt. Die neueste unterstützte Version ist "1".
  • CS9233: Ein Aufruf in der Datei "Datei" kann nicht abgefangen werden, da er an anderer Stelle in der Kompilierung dupliziert wird.
  • CS9234: Ein Aufruf in der Datei "Datei" kann nicht abgefangen werden, da in der Kompilierung keine übereinstimmende Datei gefunden wurde.
  • CS9235: Das Datenargument "InterceptsLocationAttribute" verweist auf eine ungültige Position in der Datei "Datei".

Befolgen Sie die folgenden Regeln für gültige Interceptordeklarationsdeklarationen und InterceptsLocationAttribute -verwendung, um Fehler bei der Interceptordeklaration zu beheben:

  • Formatieren Sie das InterceptsLocationAttribute Datenargument richtig (CS9231). Das Attribut erfordert speziell strukturierte Daten, die Dateipfad- und Positionsinformationen codieren. Stellen Sie sicher, dass der Quellgenerator Daten im erwarteten Format erzeugt, das der aktuellen Interceptors-Spezifikation entspricht.
  • Verwenden Sie Version "1" in Ihrem InterceptsLocationAttribute (CS9232), da sie die neueste unterstützte Version ist. Aktualisieren Sie den Quellgenerator auf die Ausgabe von Formatattributen der Version 1 anstelle nicht unterstützter Versionsnummern.
  • Stellen Sie eindeutige Dateipfade in Ihrer Kompilierung (CS9233, CS9234) sicher. Wenn die Kompilierung doppelte Dateipfade enthält, benennen Sie Dateien um, oder organisieren Sie sie neu, um jeden Pfad eindeutig zu machen. Stellen Sie sicher, dass der Dateipfad im Attribut einer Datei entspricht, die tatsächlich in der Kompilierung enthalten ist.
  • Prüfen der Positionsdatenpunkte auf gültige Code-Lokationen (CS9235). Die Zeilen- und Zeichennummern müssen auf einen gültigen Abfangpunkt innerhalb der angegebenen Datei verweisen. Generieren Sie das Attribut neu, wenn sich die Quelldatei geändert hat oder die Position außerhalb der Grenzen der Datei liegt.
  • Deklarieren Sie nicht-generische Interceptormethoden in nicht-generischen Typen (CS9138). Interceptors können keine Typparameter für die Methode selbst oder für den zugehörigen Typ haben. Wenn Sie eine generische Methode abfangen müssen, erstellen Sie einen nicht generischen Interceptor, der mit dem spezifischen konstruierten Typ funktioniert.
  • Machen Sie Interceptoren zu gewöhnlichen Membermethoden (CS9146). Interceptors können keine Operatoren, Konstruktoren, Finalizer, Eigenschaften oder Indexer sein. Deklarieren Sie den Interceptor als normale statische oder Instanzmethode.
  • Abfangen tatsächlicher Methodenaufrufe, nicht Ausdrücke (CS9151, CS9207). Aufrufe von normalen Membermethoden können nur abgefangen werden. Sie können Methodengruppen, Delegaten oder Methoden, auf die verwiesen wird, nicht abfangen, ohne dass sie aufgerufen werden. Stellen Sie sicher, dass der abfangende Standort einen tatsächlichen Methodenaufruf identifiziert.
  • Entfernen doppelter Abfangenversuche (CS9153). Jeder Methodenaufruf kann nur einmal abgefangen werden. Wenn mehrere InterceptsLocationAttribute Instanzen auf denselben Aufruf abzielen, entfernen Sie alle außer einer Instanz, um die Mehrdeutigkeit zu beheben.
  • Abfangen Sie keine Operatoren nameof (CS9160). Der nameof Operator ruft zur Laufzeit keine Methoden auf, sodass er nicht abgefangen werden kann. Nur tatsächliche Methodenaufrufe abfangen, die zur Laufzeit ausgeführt werden.
  • Entfernen Sie UnmanagedCallersOnlyAttribute von Interceptors (CS9161). Interceptors müssen aus verwaltetem Code aufgerufen werden können und können nicht mit UnmanagedCallersOnlyAttributemarkiert werden. Entfernen Sie das Attribut aus der Deklaration der Interceptor-Methode.
  • Deklarieren von Interceptoren in einem Namespace (CS9206). Interceptors können nicht im globalen Namespace deklariert werden und müssen in zumindest einer Namespace-Deklaration enthalten sein. Umschließen Sie die Interceptorklasse in einem Namespace.
  • Auflösen doppelter Dateipfade auf Kompilierungsebene (CS9152). Wenn mehrere Dateien denselben Pfad in der Kompilierung gemeinsam verwenden, kann der Compiler nicht bestimmen, in welcher Datei abgefangen werden soll. Stellen Sie sicher, dass die Buildkonfiguration eindeutige Dateipfade erzeugt oder eine andere Organisationsstrategie für Ihre Quelldateien verwendet.

Kompatibilität des Analyzers

Die folgenden Warnungen weisen auf Probleme mit Analyzer- oder Quellgeneratorassemblys hin:

  • CS9057: Analyzer-Assembly kann nicht verwendet werden, da sie auf eine neuere Version des Compilers verweist als auf die derzeit ausgeführte Version.
  • CS9067: Analyzer-Referenz wurde mehrmals angegeben.

Diese Warnungen treten auf, wenn Kompatibilitätsprobleme mit Analyser-Assemblys auftreten.

  • CS9057 wird generiert, wenn eine Analyseassembly auf eine Version des Roslyn-Compilers verweist, der neuer ist als die derzeit ausgeführte. Dadurch wird verhindert, dass der Analyzer geladen wird, da er möglicherweise von APIs oder Verhaltensweisen abhängt, die in der aktuellen Compilerversion nicht verfügbar sind. Um dies zu beheben, aktualisieren Sie entweder Ihren Compiler/SDK so, dass sie den Anforderungen des Analyzers entspricht, oder verwenden Sie eine Version des Analyzers, die mit Ihrer aktuellen Compilerversion kompatibel ist.
  • CS9067 warnt, wenn in Ihrem Projekt mehrmals auf dieselbe Analyseassembly verwiesen wird. Dies geschieht in der Regel, wenn ein Analysator über mehrere Pfade oder Paketverweise einbezogen wird. Während kein Fehler auftritt, können doppelte Verweise die Buildleistung beeinträchtigen und zu unerwartetem Verhalten führen. Entfernen Sie die doppelten Verweise, um diese Warnung zu beheben.