Condividi tramite


Errori e avvisi associati a generatori di origine e intercettori

Gli errori seguenti vengono generati quando i generatori di origine o gli intercettori vengono caricati durante una compilazione:

  • CS9137: la funzionalità sperimentale 'intercettori' non è abilitata. Aggiungere <Features>InterceptorsPreview<Features> al progetto.
  • CS9138: Il metodo non può essere usato come intercettore perché il metodo o 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. Intendevi usare un percorso diverso?
  • CS9141: il numero di riga e carattere specificato non fa riferimento a un nome di metodo intercettabile, ma piuttosto a un 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 di un 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 questo percorso 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: l'intercettore deve essere non generico o avere un'arità corrispondente.
  • CS9178: Il metodo deve essere non generico per la corrispondenza
  • CS9206: un intercettore non può essere dichiarato nello spazio dei nomi globale.
  • CS9207: impossibile intercettare perché il metodo non è una chiamata di un metodo membro ordinario.

Gli avvisi seguenti vengono generati quando i generatori di origine o gli intercettori vengono caricati durante una compilazione:

  • 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:

Gli intercettori sono sperimentali

Questo errore indica che è necessario abilitare la funzionalità sperimentale.

  • CS9137: la funzionalità sperimentale 'intercettori' non è abilitata. Aggiungere <Features>InterceptorsPreview<Features> al progetto.

In C# 12 gli intercettori sono sperimentali. Gli intercettori sono soggetti a modifiche che rompono la compatibilità o alla rimozione in una versione futura. Pertanto, non è consigliabile per le applicazioni di produzione o rilasciate.

Per usare gli intercettori, è necessario impostare l'elemento <Features>InterceptorsPreview<Features> nel file di progetto. Senza questo flag, gli intercettori sono disabilitati, anche quando sono abilitate altre funzionalità C# 12.

Incongruenza della firma

Gli errori seguenti indicano una mancata corrispondenza tra il metodo intercettore e il metodo intercettabile oppure una violazione delle regole relative alle dichiarazioni del metodo intercettore:

  • 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]: l'intercettore deve essere non generico o avere un'arità corrispondente.
  • CS9178: Il metodo deve essere non generico per la corrispondenza

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)

Il metodo intercettore deve essere compatibile con il metodo intercettabile. È necessario seguire queste regole:

  • I metodi di istanza possono intercettare metodi di istanza, non metodi statici. Analogamente, i metodi statici possono intercettare solo metodi statici, non metodi di istanza.
  • Le firme del metodo per l'intercettore e il metodo intercettabile devono corrispondere: devono avere gli stessi parametri con gli stessi modificatori nello stesso ordine. I tipi di ritorno devono corrispondere.
  • I riferimenti ai contesti sicuri devono corrispondere. In altre parole, i parametri corrispondenti ref devono essere scoped o meno scoped.
  • Entrambi i metodi devono essere non generici oppure entrambi devono avere lo stesso numero di parametri di tipo.
  • È preferibile una firma del costruttore aggiornata InterceptorLocationAttribute .

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. Intendevi usare un percorso diverso?
  • CS9141: il numero di riga e carattere specificato non fa riferimento a un nome di metodo intercettabile, ma piuttosto a un 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 di un 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.

Un intercettore specifica la posizione nel codice sorgente del metodo intercettabile. Specificare la posizione applicando un [InterceptsLocation] attributo. Specificare i numeri di riga e di colonna in un file di origine mappato in cui deve essere inserito l'intercettore. Questi errori indicano che qualcosa nell'attributo o nella posizione non corrisponde a una posizione per un metodo intercettabile valido. Per informazioni dettagliate sul formato e i valori per questo attributo, vedere la specifica della funzionalità.

Altri errori

Questi errori indicano altre limitazioni per gli intercettori:

  • CS9138: Il metodo non può essere usato come intercettore perché esso o il suo tipo contenitore 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 questo percorso 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 perché il metodo non è una chiamata di un metodo membro ordinario.

Questi errori indicano che il metodo intercettore viola una delle regole per gli intercettori:

  • Gli intercettori non possono essere metodi generici o membri di classi generiche.
  • Gli intercettori devono essere membri ordinari. Non possono essere operatori, costruttori di istanza, costruttori statici o finalizzatori.
  • I metodi intercettabili devono essere membri ordinari. Non possono essere operatori, costruttori di istanza o statici, finalizzatori, né invocazioni di delegati.
  • I metodi intercettabili che non vengono mai richiamati non possono essere intercettati.
  • I metodi intercettabili possono essere intercettati al massimo una volta.
  • Gli intercettori non possono essere metodi riservati esclusivamente ai chiamanti non gestiti.
  • Gli intercettori devono essere contenuti in uno spazio dei nomi.