Errori e avvisi associati a generatori di origine e intercettori

Gli errori seguenti si verificano quando il compilatore carica generatori di origine o intercettori durante la compilazione:

  • CS9137: la funzionalità 'intercettori' non è abilitata in questo spazio dei nomi. Aggiungere <Features>InterceptorsPreview</Features> al progetto.
  • CS9138: Il metodo 'method' non può essere usato come intercettore perché il tipo che lo contiene ha parametri di tipo.
  • CS9139: Impossibile intercettare: la compilazione non contiene un file con percorso.
  • CS9140: impossibile intercettare: la compilazione non contiene un file con percorso 'path'. Si intende usare il percorso 'candidatePath'?
  • CS9141: il numero di riga e carattere specificato non fa riferimento a un nome di metodo intercettabile, ma piuttosto al token 'token'.
  • CS9142: il file specificato contiene n righe, che è minore del numero mdi riga specificato.
  • CS9143: La riga specificata è lunga c caratteri, che è meno del numero di caratteri fornito n.
  • CS9144: impossibile intercettare il metodo M con l'intercettore V perché le firme non corrispondono.
  • CS9145: Impossibile intercettare: il percorso non è mappato. Percorso mappato previsto.
  • CS9146: un metodo intercettore deve essere un metodo membro ordinario.
  • CS9147: il numero di riga e carattere specificato non fa riferimento all'inizio del token 'token'. Intendevi usare la riga 'n' e il carattere 'c'?
  • CS9148: l'intercettore deve avere un this parametro corrispondente al parametro.
  • CS9149: l'intercettore non deve avere un this parametro perché il metodo non dispone di un this parametro.
  • CS9150: l'intercettore non può avere un percorso di null file.
  • CS9151: impossibile intercettare il nome M del metodo possibile perché non viene richiamato.
  • CS9152: impossibile intercettare una chiamata nel file con percorso 'path' perché più file nella compilazione hanno questo percorso.
  • CS9153: la chiamata indicata viene intercettata più volte.
  • CS9155: impossibile intercettare la chiamata con M perché non è accessibile all'interno di V.
  • CS9156: Impossibile intercettare la chiamata a M con V a causa di una differenza nei 'modificatori' con ambito o negli attributi [UnscopedRef].
  • CS9157: i numeri di riga e di carattere specificati per InterceptsLocationAttribute devono essere positivi.
  • CS9160: non è possibile intercettare un operatore nameof.
  • CS9161: un intercettore non può essere contrassegnato con UnmanagedCallersOnlyAttribute.
  • CS9177: il metodo 'method' deve essere non generico o avere arity 'arity' per trovare la corrispondenza con 'target'.
  • CS9178: il metodo 'method' deve essere non generico in modo che corrisponda a 'target'.
  • CS9206: un intercettore non può essere dichiarato nello spazio dei nomi globale.
  • CS9207: impossibile intercettare 'method' perché non è una chiamata di un metodo membro ordinario.
  • CS9231: l'argomento dati di InterceptsLocationAttribute non è nel formato corretto.
  • CS9232: la versione 'version' del formato degli intercettori non è supportata. La versione supportata più recente è '1'.
  • CS9233: impossibile intercettare una chiamata nel file 'file' perché è duplicata altrove nella compilazione.
  • CS9234: impossibile intercettare una chiamata nel file 'file' perché non è stato trovato un file corrispondente nella compilazione.
  • CS9235: l'argomento dati di InterceptsLocationAttribute fa riferimento a una posizione non valida nel file 'file'.

Gli avvisi seguenti si verificano quando il compilatore carica generatori di origine o intercettori durante la compilazione:

  • CS8032: non è possibile creare un'istanza dell'analizzatore 'analyzer' da 'assembly': 'reason'.
  • CS8033: L'assembly 'assembly' non contiene alcun analizzatore.
  • CS8034: impossibile caricare l'assembly dell'analizzatore 'assembly': 'reason'
  • CS8040: Alcuni tipi nell'assembly dell'analizzatore 'assembly' vengono ignorati a causa di una ReflectionTypeLoadException: 'exception'.
  • CS8700: più file di configurazione dell'analizzatore non possono trovarsi nella stessa directory ('directory').
  • CS8784: Impossibile inizializzare il generatore 'generatore'. Non contribuirà all'output e gli errori di compilazione potrebbero verificarsi di conseguenza. Eccezione di tipo 'exception' con messaggio 'message'.
  • CS8785: Il generatore 'generator' non è riuscito a generare l'origine. Non contribuirà all'output e gli errori di compilazione potrebbero verificarsi di conseguenza. Eccezione di tipo 'exception' con messaggio 'message'.
  • CS8850: L'assembly 'assembly' che contiene il tipo 'type' fa riferimento a .NET Framework, che non è supportato.
  • CS9057: Impossibile usare l'assembly dell'analizzatore 'assembly' perché fa riferimento alla versione 'version' del compilatore, che è più recente della versione attualmente in esecuzione 'currentVersion'.
  • CS9067: Riferimento dell'analizzatore 'reference' specificato più volte
  • CS9154: intercettazione di una chiamata a M con intercettore V, ma le firme non corrispondono.
  • CS9158: La nullabilità dei tipi di riferimento nel tipo di ritorno non corrisponde al metodo intercettabile.
  • CS9159: La nullabilità dei tipi di riferimento nel tipo di parametro non è coerente con il metodo intercettabile.
  • CS9270: 'InterceptsLocationAttribute(string, int, int)' non è supportato. Passare invece alla generazione basata su 'InterceptableLocation' di questi attributi. (https://github.com/dotnet/roslyn/issues/72133)

Questi errori e avvisi seguono questi temi:

Errori del generatore di origine

  • CS8784: Impossibile inizializzare il generatore 'generatore'. Non contribuirà all'output e gli errori di compilazione potrebbero verificarsi di conseguenza. Eccezione di tipo 'exception' con messaggio 'message'.
  • CS8785: Il generatore 'generator' non è riuscito a generare l'origine. Non contribuirà all'output e gli errori di compilazione potrebbero verificarsi di conseguenza. Eccezione di tipo 'exception' con messaggio 'message'.

Questi avvisi indicano che un generatore di origine ha generato un'eccezione non gestita durante la compilazione. I generatori di origine vengono eseguiti come parte della pipeline di compilazione e un errore impedisce al generatore di contribuire alla compilazione. Per altre informazioni sull'implementazione dei generatori di origine, vedere Generatori di origine.

Per correggere questi avvisi, seguire queste indicazioni:

  • Esaminare i dettagli completi dell'eccezione nell'output di compilazione per identificare la causa radice (CS8784, CS8785). Il messaggio di avvertimento include il tipo di eccezione, il messaggio e la traccia dello stack, che possono aiutare l'utente o l'autore del generatore a diagnosticare l'errore.
  • Verificare che tutte le dipendenze necessarie per il generatore di origine siano disponibili nel progetto (CS8784). Gli errori di inizializzazione spesso si verificano quando il generatore non riesce a individuare un assembly o una risorsa necessari durante l'avvio. Verificare che il pacchetto NuGet del generatore sia installato correttamente e che tutte le dipendenze transitive vengano risolte.
  • Segnalare l'errore al gestorio del generatore di origine se l'eccezione ha origine nel codice del generatore di terze parti (CS8784, CS8785). Includi i dettagli completi dell'eccezione dall'output della compilazione nella segnalazione di bug.
  • Se si è l'autore del generatore di origine, aggiungi la gestione delle eccezioni nei metodi Initialize o Execute per intercettare e segnalare gli errori in modo appropriato (CS8784, CS8785).

Compatibilità dell'analizzatore e del generatore di origine

  • CS8032: non è possibile creare un'istanza dell'analizzatore 'analyzer' da 'assembly': 'reason'.
  • CS8033: L'assembly 'assembly' non contiene analizzatori.
  • CS8034: Impossibile caricare l'assembly dell'analizzatore 'assembly' : 'reason'
  • CS8040: Vengono ignorati alcuni tipi nell'assembly dell'analizzatore 'assembly' a causa di una ReflectionTypeLoadException : 'exception'.
  • CS8700: più file di configurazione dell'analizzatore non possono trovarsi nella stessa directory ('directory').
  • CS8850: L'assembly 'assembly' contenente il tipo 'type' fa riferimento a .NET Framework, che non è supportato.
  • CS9057: Impossibile usare l'assembly dell'analizzatore 'assembly' perché fa riferimento alla versione 'version' del compilatore, che è più recente della versione attualmente in uso 'currentVersion'.
  • CS9067: riferimento dell'analizzatore 'reference' specificato più volte

Questi avvisi ed errori indicano problemi nel caricamento, nell'istanziazione o nella configurazione degli assembly degli analizzatori e dei generatori di codice sorgente. Poiché i generatori di codice sorgente vengono caricati come assembly di analizzatore, questa diagnostica si applica sia agli analizzatori sia ai generatori di codice sorgente.

Per risolvere questi problemi, seguire queste indicazioni:

  • Aggiornare l'SDK .NET o la versione del compilatore in base ai requisiti dell'analizzatore oppure usare una versione precedente del pacchetto analizzatore compatibile con il compilatore corrente (CS9057). Questo errore si verifica quando un assembly dell'analizzatore è destinato a una versione più recente dell'API Roslyn rispetto a quella fornita dal compilatore in esecuzione.
  • Rimuovere i riferimenti duplicati all'analizzatore dal progetto (CS9067). Controllare il file di progetto per individuare elementi <Analyzer> o <PackageReference> ripetuti che includono lo stesso assembly dell'analizzatore tramite percorsi diversi. Le dipendenze transitive dei pacchetti possono anche causare duplicati.
  • Verificare che l'assembly dell'analizzatore sia un assembly di .NET valido e non sia danneggiato (CS8034). Se l'assembly non può essere caricato affatto, verificare che il file esista nel percorso a cui si fa riferimento ed è stato compilato per un framework di destinazione compatibile. Ricompilare o reinstallare il pacchetto NuGet per ottenere una copia aggiornata.
  • Verificare che il tipo di analizzatore abbia un costruttore pubblico senza parametri (CS8032). Il compilatore istanzia gli analizzatori chiamando il loro costruttore predefinito. Se il costruttore genera un'eccezione o richiede parametri, l'analizzatore non può essere creato.
  • Verificare che l'assembly di riferimento esporti effettivamente tipi di analizzatore o di generatore di codice sorgente (CS8033). Un assembly a cui viene fatto riferimento come analizzatore deve contenere tipi che implementano DiagnosticAnalyzer o ISourceGenerator/IIncrementalGenerator. Se l'assembly è una dipendenza di runtime anziché un analizzatore, includila invece come un normale riferimento di progetto o di pacchetto.
  • Risolvere i problemi di caricamento dei tipi nell'assembly dell'analizzatore assicurandosi che tutte le relative dipendenze siano disponibili (CS8040). Un ReflectionTypeLoadException indica in genere che l'assembly fa riferimento a tipi di altri assembly che non possono essere trovati. Assicurarsi che tutte le dipendenze necessarie siano incluse nel pacchetto NuGet dell'analizzatore.
  • Verificare che i file di configurazione dell'analizzatore (.editorconfig o .globalconfig) siano univoci per ogni directory (CS8700). Il compilatore non consente più file di configurazione dell'analizzatore nella stessa directory perché le regole di precedenza sarebbero ambigue. Unire i file o rimuovere il duplicato.
  • Aggiornare l'analizzatore o il generatore di origine per .NET standard o .NET moderno anziché .NET Framework (CS8850). Gli assembly che fanno riferimento a .NET Framework non sono supportati nella toolchain del compilatore .NET moderna. Se si gestisce l'analizzatore, reindirizzarlo a netstandard2.0. Se si tratta di un pacchetto di terze parti, eseguire l'aggiornamento a una versione che supporta i .NET moderni.

Gli intercettori sono sperimentali

  • CS9137: la funzionalità 'intercettori' non è abilitata in questo spazio dei nomi. Aggiungere <Features>InterceptorsPreview</Features> al progetto.

Per usare gli intercettori, aggiungere l'elemento <Features>InterceptorsPreview</Features> al file di progetto all'interno di una <PropertyGroup> sezione (CS9137). Gli intercettori sono una funzionalità sperimentale e non sono abilitati per impostazione predefinita. Questa adesione esplicita è richiesta perché la funzionalità degli intercettori è soggetta a modifiche incompatibili o a rimozione nelle versioni future. Il compilatore necessita di confermare che si conoscono i rischi prima di consentirne l'uso. Per altre informazioni sugli intercettori e sulle relative funzionalità, vedere Intercettori nella documentazione sulle funzionalità di C# 12.

Incongruenza della firma

Gli errori e gli avvisi seguenti indicano una mancata corrispondenza tra il metodo intercettore e il metodo intercettabile.

  • CS9144: impossibile intercettare il metodo M con l'intercettore V perché le firme non corrispondono.
  • CS9148: this
  • CS9149: l'intercettore non deve avere un this parametro perché il metodo non dispone di un this parametro.
  • CS9155: impossibile intercettare la chiamata con M perché non è accessibile all'interno di V.
  • CS9156: Impossibile intercettare la chiamata a M con V a causa di una differenza nei modificatori 'scoped' o negli attributi [UnscopedRef].
  • CS9177: il metodo 'method' deve essere non generico o avere arity 'arity' per trovare la corrispondenza con 'target'.
  • CS9178: il metodo 'method' deve essere non generico in modo che corrisponda a 'target'.

Inoltre, gli avvisi seguenti indicano una mancata corrispondenza tra le firme dell'intercettore e il metodo intercettabile:

  • CS9154: intercettazione di una chiamata a M con intercettore V, ma le firme non corrispondono.
  • CS9158: La nullabilità dei tipi di riferimento nel tipo restituito non corrisponde a quella del metodo intercettabile.
  • CS9159: La nullabilità dei tipi di riferimento nel tipo di parametro non corrisponde al metodo intercettabile.
  • CS9270: 'InterceptsLocationAttribute(string, int, int)' non è supportato. Passare invece alla generazione basata su 'InterceptableLocation' di questi attributi. (https://github.com/dotnet/roslyn/issues/72133)

Per risolvere questi problemi, verificare che il metodo dell'intercettore corrisponda ai requisiti di firma e accesso del metodo intercettabile:

  • Verificare che la firma del metodo intercettore corrisponda esattamente al metodo intercettabile (CS9144, CS9154). I tipi di parametro, modificatori, ordine e tipo restituito devono essere identici. Esaminare entrambe le dichiarazioni di metodo e allinearne le firme.
  • Aggiungere un this parametro all'intercettore quando il metodo intercettabile è un metodo di istanza (CS9148) o rimuovere il this parametro quando il metodo intercettabile è statico (CS9149). Gli intercettori di istanza richiedono un this parametro del tipo dichiarante, mentre gli intercettori statici non devono avere uno.
  • Dichiarare l'intercettore in una posizione in cui il metodo intercettabile è accessibile (CS9155). Se il metodo intercettabile è internal, l'intercettore deve trovarsi nello stesso assembly. Se è private, l'intercettore deve trovarsi nello stesso tipo o in un tipo annidato.
  • Abbina i scoped modificatori e gli [UnscopedRef] attributi nei parametri corrispondenti ref (CS9156). Ogni ref parametro nell'intercettore deve avere le stesse annotazioni di durata del parametro corrispondente nel metodo intercettabile per garantire la sicurezza della memoria.
  • Assicurarsi che entrambi i metodi abbiano un'arità generica corrispondente (CS9177, CS9178). Se il metodo intercettabile non è generico, l'intercettore deve anche essere non generico. Se il metodo intercettabile ha parametri di tipo, l'intercettore deve avere lo stesso numero di parametri di tipo con vincoli compatibili.
  • Abbina le annotazioni di nullability nel tipo restituito (CS9158) e nei tipi di parametro (CS9159). Abilita i tipi di riferimento nullable nel progetto e assicurati che le annotazioni di nullabilità dell'intercettatore corrispondano esattamente al metodo intercettabile per mantenere la sicurezza dei tipi.
  • Usare la generazione aggiornata basata su InterceptableLocation per InterceptsLocationAttribute invece del costruttore deprecato (string, int, int) (CS9270). Il formato più recente offre un supporto migliore per gli strumenti e la convalida in fase di compilazione. Per indicazioni sulla migrazione, vedere il problema di GitHub .

Mapping non corretto

Gli intercettori richiedono una mappatura che associ la funzione intercettabile e la funzione dell'intercettore. Gli errori seguenti indicano un problema con il mapping:

  • CS9139: Impossibile intercettare: la compilazione non contiene un file con percorso.
  • CS9140: impossibile intercettare: la compilazione non contiene un file con percorso 'path'. Si intende usare il percorso 'candidatePath'?
  • CS9141: il numero di riga e carattere specificato non fa riferimento a un nome di metodo intercettabile, ma piuttosto al token 'token'.
  • CS9142: il file specificato contiene n righe, che è minore del numero mdi riga specificato.
  • CS9143: la riga specificata è c lunga, minore del numero ndi carattere specificato.
  • CS9145: Impossibile intercettare: il percorso non è mappato. Percorso mappato previsto.
  • CS9147: il numero di riga e carattere specificato non fa riferimento all'inizio del token 'token'. Intendevi usare la riga 'n' e il carattere 'c'?
  • CS9150: l'intercettore non può avere un percorso di null file.
  • CS9157: i numeri di riga e di carattere specificati per InterceptsLocationAttribute devono essere positivi.

Per correggere gli errori di mapping, verificare che InterceptsLocationAttribute contenga percorsi di file validi e informazioni accurate sulla posizione:

  • Verificare che il percorso del file corrisponda esattamente a un file nella compilazione (CS9139, CS9140). Usare il percorso esatto visualizzato nel progetto, includendo la corretta distinzione tra maiuscole e minuscole e i separatori di directory. Se il compilatore suggerisce un percorso alternativo, aggiornare l'attributo per usare tale percorso.
  • Usare i percorsi di file mappati quando si usano generatori di origine che trasformano i percorsi dei file (CS9145). I generatori di origine spesso rieseguino il mapping dei percorsi per i file generati ed è necessario usare il percorso mappato riconosciuto dal compilatore, non il percorso di origine originale.
  • Verificare che il percorso del file non sia null nel tuo InterceptsLocationAttribute (CS9150). Ogni intercettazione deve specificare un percorso di file non Null valido che identifica il file di origine contenente la chiamata da intercettare.
  • Indicare numeri di riga e carattere positivi a partire da 1 (CS9157). I numeri di riga e le posizioni dei caratteri devono iniziare da 1, non da 0. Verificare che il generatore di origine usi l'indicizzazione basata su 1 durante il calcolo delle posizioni.
  • Puntare all'inizio esatto del token del nome del metodo (CS9141, CS9147). I numeri di riga e di carattere devono identificare il primo carattere del nome del metodo nella chiamata, non spazi vuoti, operatori o altri token. Se il compilatore suggerisce coordinate alternative, usare quelle per impostare come destinazione l'avvio corretto del token.
  • Rimanere entro i limiti del file (CS9142, CS9143). Verificare che il numero di riga non superi il numero totale di righe e il numero di caratteri non superi la lunghezza della riga. Ricalcolare le posizioni se il file di origine è stato modificato dopo la generazione dell'attributo.

Dichiarazione dell'intercettore non corretta

Gli errori seguenti indicano problemi con le dichiarazioni dell'intercettore, inclusi i problemi relativi al formato o alle violazioni delle regole dell'intercettore InterceptsLocationAttribute :

  • CS9138: Il metodo 'method' non può essere usato come intercettore perché il tipo che lo contiene ha parametri di tipo.
  • CS9146: un metodo intercettore deve essere un metodo membro ordinario.
  • CS9151: impossibile intercettare il nome M del metodo possibile perché non viene richiamato.
  • CS9152: impossibile intercettare una chiamata nel file con percorso 'path' perché più file nella compilazione hanno questo percorso.
  • CS9153: la chiamata indicata viene intercettata più volte.
  • CS9160: non è possibile intercettare un operatore nameof.
  • CS9161: un intercettore non può essere contrassegnato con UnmanagedCallersOnlyAttribute.
  • CS9206: un intercettore non può essere dichiarato nello spazio dei nomi globale.
  • CS9207: impossibile intercettare 'method' perché non è una chiamata di un metodo membro ordinario.
  • CS9231: L'argomento dati di InterceptsLocationAttribute non è nel formato corretto.
  • CS9232: La versione 'version' del formato degli intercettori non è supportata. La versione supportata più recente è '1'.
  • CS9233: impossibile intercettare una chiamata nel file 'file' perché è duplicata altrove nella compilazione.
  • CS9234: impossibile intercettare una chiamata nel file 'file' perché non è stato trovato un file corrispondente nella compilazione.
  • CS9235: l'argomento dati di InterceptsLocationAttribute fa riferimento a una posizione non valida nel file 'file'.

Per correggere gli errori di dichiarazione dell'intercettore, seguire queste regole per una dichiarazione valida degli interceptor e per l'uso di InterceptsLocationAttribute:

  • Formattare correttamente l'argomento InterceptsLocationAttribute dati (CS9231). L'attributo richiede dati strutturati specifici che codificano le informazioni sul percorso e sulla posizione del file. Verificare che il generatore di origine produa dati nel formato previsto corrispondente alla specifica degli intercettori correnti.
  • Usare la versione '1' in InterceptsLocationAttribute (CS9232), perché è la versione supportata più recente. Aggiorna il generatore di origine affinché produca attributi nel formato versione 1 anziché numeri di versione non supportati.
  • Assicurati che i percorsi di file siano univoci nella compilazione (CS9233, CS9234). Quando la compilazione contiene percorsi di file duplicati, rinominare o riorganizzare i file per rendere univoco ogni percorso. Verificare che il percorso del file nell'attributo corrisponda a un file effettivamente incluso nella compilazione.
  • Convalidare i dati di posizione rispetto a posizioni di codice valide (CS9235). I numeri di riga e di carattere devono fare riferimento a un punto di intercettazione valido all'interno del file specificato. Rigenerare l'attributo se il file di origine è stato modificato o se la posizione non rientra nei limiti del file.
  • Dichiarare metodi intercettori non generici in tipi non generici (CS9138). Gli intercettori non possono essere dichiarati in tipi con parametri di tipo. Se è necessario intercettare un metodo generico, creare un intercettore non generico in un tipo contenitore non generico che funziona con il tipo costruito specifico.
  • Trasformare gli intercettori in metodi membro comuni (CS9146). Gli intercettori non possono essere operatori, costruttori, finalizzatori, proprietà o indicizzatori. Dichiarare l'intercettore come metodo statico o di istanza normale.
  • Intercettare le chiamate effettive al metodo, non le espressioni (CS9151, CS9207). È possibile intercettare solo le chiamate ai metodi dei membri ordinari richiamati. Non è possibile intercettare gruppi di metodi, delegati o metodi a cui si fa riferimento senza essere chiamati. Verificare che la posizione intercettabile identifichi una chiamata al metodo effettiva.
  • Rimuovere i tentativi di intercettazione duplicati (CS9153). Ogni chiamata al metodo può essere intercettata una sola volta. Se più InterceptsLocationAttribute istanze hanno come destinazione la stessa chiamata, rimuovere tutte le istanze ma una per risolvere l'ambiguità.
  • Non intercettare nameof gli operatori (CS9160). L'operatore nameof non richiama i metodi in fase di esecuzione, quindi non può essere intercettato. Intercettare solo le chiamate di metodo effettive eseguite in fase di esecuzione.
  • Rimuovere UnmanagedCallersOnlyAttribute dagli intercettori (CS9161). Gli intercettori devono essere chiamabili dal codice gestito e non possono essere contrassegnati con UnmanagedCallersOnlyAttribute. Rimuovere l'attributo dalla dichiarazione del metodo dell'intercettore.
  • Dichiara intercettori all'interno di un namespace (CS9206). Gli intercettori non possono essere dichiarati nello spazio dei nomi globale e devono essere contenuti all'interno di almeno una dichiarazione dello spazio dei nomi. Racchiudi la classe dell'intercettore in uno spazio dei nomi.
  • Risolvere i percorsi di file duplicati a livello di compilazione (CS9152). Quando più file condividono lo stesso percorso nella compilazione, il compilatore non riesce a determinare quale file intercettare. Assicurarsi che la configurazione di compilazione produa percorsi di file univoci o usi una strategia organizzativa diversa per i file di origine.