Risolvere gli errori e gli avvisi per le funzionalità e le versioni del linguaggio

Questo articolo illustra gli errori e gli avvisi del compilatore seguenti:

  • CS0171: Il campo 'name' deve essere completamente assegnato prima di restituire il controllo al chiamante. Valutare l'aggiornamento alla versione del linguaggio 'version' per impostare automaticamente il valore predefinito del campo.
  • CS0188: impossibile utilizzare l'oggetto 'this' prima che tutti i relativi campi siano stati assegnati. Prendere in considerazione l'aggiornamento alla versione della lingua 'version' per impostazione predefinita automatica dei campi non assegnati.
  • CS0843: la proprietà 'name' implementata automaticamente deve essere assegnata completamente prima che il controllo venga restituito al chiamante. Prendere in considerazione l'aggiornamento alla versione della lingua 'version' per l'impostazione predefinita automatica della proprietà.
  • CS1617: opzione 'option' non valida per /langversion. Usare '/langversion:?' per elencare i valori supportati.
  • CS1638: 'identifier' è un identificatore riservato e non può essere usato quando viene usata la modalità di versione del linguaggio ISO
  • CS1738: le specifiche degli argomenti denominati devono essere visualizzate dopo che tutti gli argomenti fissi sono stati specificati. Usare la versione 7.2 o successiva della lingua per consentire argomenti denominati non finali.
  • CS8021: nessun valore per RuntimeMetadataVersion trovato. Non è stato trovato alcun assembly contenente System.Object né è stato specificato alcun valore per RuntimeMetadataVersion tramite le opzioni.
  • CS8022: La funzionalità non è disponibile in C# 1. Usare la versione del linguaggio 2 o successiva.
  • CS8023: La funzionalità non è disponibile in C# 2. Usare la versione del linguaggio 3 o successiva.
  • CS8024: La funzionalità non è disponibile in C# 3. Usare la versione 4 o successiva del linguaggio.
  • CS8025: la funzionalità non è disponibile in C# 4. Usare la versione 5 o successiva della lingua.
  • CS8026: la funzionalità non è disponibile in C# 5. Usare la versione 6 o successiva della lingua.
  • CS8058: la funzionalità 'feature' è sperimentale e non supportata. Usare '/features:feature' per abilitare.
  • CS8059: la funzionalità non è disponibile in C# 6. Usare la lingua 7 o successiva.
  • CS8107: la funzionalità non è disponibile in C# 7.0. Usare la lingua 7.1 o successiva.
  • CS8192: la versione della lingua specificata non è supportata o non è valida: 'value'.
  • CS8302: la funzionalità non è disponibile in C# 7.1. Usare la lingua 7.2 o successiva.
  • CS8303: La versione del linguaggio specificata 'value' non può avere zere iniziali
  • CS8304: versione del compilatore: 'version'. Versione della lingua: versione.
  • CS8305: "type" è solo a scopo di valutazione ed è soggetto a modifiche o rimozione negli aggiornamenti futuri.
  • CS8306: viene dedotto il nome dell'elemento Tuple 'name'. Usare la lingua 7.1 o successiva per accedere a un elemento in base al nome dedotto.
  • CS8314: un'espressione di tipo 'type' non può essere gestita da un modello di tipo 'type' nella versione C#. Usare la versione della lingua 'version' o versione successiva.
  • CS8320: la funzionalità non è disponibile in C# 7.2. Usare la lingua 7.3 o successiva.
  • CS8370: la funzionalità non è disponibile in C# 7.3. Usare la lingua 8 o successiva.
  • CS8371: Gli attributi con destinazione field nelle proprietà automatiche non sono supportati nella versione 7.3 del linguaggio. Usare la versione 8.0 o successiva.
  • CS8400: la funzionalità non è disponibile in C# 8. Usare la lingua 9 o successiva.
  • CS8401: per usare '@$' anziché '$@' per una stringa verbatim interpolata, usare la versione della lingua 8.0 o successiva.
  • CS8511: Un'espressione di tipo 'type' non può corrispondere a un pattern di tipo 'type'. Usare la versione del linguaggio 'version' o successiva per far corrispondere un tipo aperto a un pattern costante.
  • CS8627: un parametro di tipo nullable deve essere noto come tipo valore o tipo riferimento non nullable a meno che non venga usata la versione del linguaggio 'version' o versione successiva. Prendere in considerazione la modifica della versione del linguaggio o l'aggiunta di un vincolo 'class', 'struct' o type.
  • CS8630: Valore dell'opzione 'option' non valido: 'value' per la versione di C#. Usare la versione 'version' del linguaggio o una successiva.
  • CS8652: la funzionalità è attualmente in anteprima e non supportata. Per usare le funzionalità di anteprima, usare la versione della lingua 'preview'.
  • CS8701: il runtime di destinazione non supporta l'implementazione dell'interfaccia predefinita.
  • CS8702: 'member' non può implementare il membro dell'interfaccia 'member' nel tipo 'type' perché il runtime di destinazione non supporta l'implementazione dell'interfaccia predefinita.
  • CS8703: Il modificatore 'modifier' non è valido per questo elemento nella versione del linguaggio C#. Usare la versione 8.0 o successiva del linguaggio.
  • CS8704: 'type' non implementa il membro dell'interfaccia 'member'. 'type' non può implementare in modo implicito un membro non pubblico nella versione C#. Usare la versione della lingua 'version' o versione successiva.
  • CS8706: il tipo non può implementare il membro dell'interfaccia nel tipo perché la funzionalità non è disponibile in C# 7.3.
  • CS8707: Il runtime di destinazione non supporta i livelli di accesso 'protected', 'protected internal' o 'private protected' per un membro di un'interfaccia.
  • CS8773: la funzionalità non è disponibile in C# 9. Usare la lingua 10 o successiva.
  • CS8830: Il runtime di destinazione non supporta i tipi restituiti covarianti negli override. Il tipo restituito deve essere 'type' per corrispondere al membro sottoposto a override 'member'.
  • CS8831: Il runtime di destinazione non supporta i tipi covarianti negli override. Il tipo deve essere 'type' per corrispondere al membro sottoposto a override 'member'.
  • CS8888: la convenzione di chiamata "gestita" non può essere combinata con gli identificatori di convenzione di chiamata non gestiti.
  • CS8889: il runtime di destinazione non supporta le convenzioni di chiamata predefinite estendibili o dell'ambiente di runtime.
  • CS8890: il tipo 'type' non è definito.
  • CS8891: il tipo 'type' deve essere pubblico per essere usato come convenzione di chiamata.
  • CS8904: varianza non valida: il parametro di tipo deve essere invariantemente valido in 'member' a meno che non venga usata la versione 9.0 o successiva della lingua.
  • CS8912: L'ereditarietà da un record con un 'Object.ToString' sigillato non è supportata in C# 9.0. Usare la versione del linguaggio 10.0 o successiva.
  • CS8919: il runtime di destinazione non supporta membri astratti statici nelle interfacce.
  • CS8929: 'method' non può implementare il membro di interfaccia 'member' nel tipo 'type' perché il runtime di destinazione non supporta membri astratti statici nelle interfacce.
  • CS8936: la funzionalità non è disponibile in C# 10. Usare la lingua 11 o successiva.
  • CS8957: l'espressione condizionale non è valida nella versione 8.0 del linguaggio perché non è stato trovato un tipo comune tra 'type' e 'type'. Per usare una conversione tipizzata di destinazione, eseguire l'aggiornamento alla versione 9.0 o successiva della lingua.
  • CS8967: le nuove righe all'interno di una stringa interpolata non verbatim non sono supportate in C# 10.0. Usare la lingua 11.0 o successiva.
  • CS9014: Uso della proprietà autoimplementata 'name', probabilmente non assegnata. Valutare l'aggiornamento alla versione del linguaggio 'version' per assegnare automaticamente un valore predefinito alla proprietà.
  • CS9015: Uso del campo 'name' potenzialmente non assegnato. Valutare l'aggiornamento alla versione del linguaggio 'version' per impostare automaticamente il valore predefinito del campo.
  • CS9016: Uso della proprietà implementata automaticamente probabilmente non assegnata 'name'. Valutare l'aggiornamento alla versione del linguaggio 'version' per assegnare automaticamente un valore predefinito alla proprietà.
  • CS9017: Uso del campo 'name' potenzialmente non assegnato. Valutare l'aggiornamento alla versione del linguaggio 'version' per impostare automaticamente un valore predefinito per il campo.
  • CS9041: 'type' richiede la funzionalità del compilatore 'feature', che non è supportata da questa versione del compilatore C#.
  • CS9058: la funzionalità non è disponibile in C# 11. Usare la lingua 12 o successiva.
  • CS9064: il runtime di destinazione non supporta i campi ref.
  • CS9103: 'type' è definito in un modulo con una versione di RefSafetyRulesAttribute non riconosciuta; è prevista la versione '11'.
  • CS9171: il runtime di destinazione non supporta i tipi di matrice inline.
  • CS9194: l'argomento potrebbe non essere passato con la parola chiave 'ref'. Per passare gli argomenti 'ref' ai parametri 'in', eseguire l'aggiornamento alla versione 12 o successiva della lingua.
  • CS9202: la funzionalità non è disponibile in C# 12.0. Usare la lingua 13 o successiva.
  • CS9204: 'type' è solo a scopo di valutazione ed è soggetto a modifiche o rimozione negli aggiornamenti futuri. Eliminare questa diagnostica per continuare.
  • CS9211: l'argomento diagnosticId dell'attributo 'Experimental' deve essere un identificatore valido.
  • CS9240: Il runtime di destinazione non supporta i tipi generici di tipo by-ref-like.
  • CS9260: la funzionalità non è disponibile in C# 13.0. Usare la lingua 14 o successiva.
  • CS9268: 'type' è solo a scopo di valutazione ed è soggetto a modifiche o rimozione negli aggiornamenti futuri: 'message'. Eliminare questa diagnostica per continuare.
  • CS9269: UnscopedRefAttribute è valido solo in C# 11 o versione successiva o quando la destinazione è net7.0 o versione successiva.
  • CS9271: Il tipo 'Microsoft. CodeAnalysis.EmbeddedAttribute' deve essere non generico, interno, non file, sealed, non statico, avere un costruttore senza parametri, ereditare da System.Attribute e poter essere applicato a qualsiasi tipo.
  • CS9327: La funzionalità non è disponibile in C# 14.0. Usare la versione del linguaggio 'version' o versione successiva.
  • CS9328: il metodo 'method' usa attualmente una funzionalità non supportata dal runtime asincrono. Rifiutare esplicitamente il metodo dall'asincrona di runtime assegnandolo a 'System.Runtime.CompilerServices.RuntimeAsyncMethodGenerationAttribute(false)'.
  • CS9346: l'aggiornamento richiede l'implementazione esplicita dell'interfaccia, che non è supportata dal runtime senza riavviare l'applicazione.
  • CS9352: il runtime di destinazione non supporta i tipi di layout estesi.

La causa di tutti questi errori e avvisi è che il compilatore o il runtime non supporta una funzionalità in uso. La risoluzione dipende dal fatto che il problema sia un problema di configurazione della versione del linguaggio, una mancata corrispondenza della versione del linguaggio, una limitazione del runtime o una funzionalità sperimentale.

Errori di configurazione della versione della lingua

  • CS1617: opzione 'option' non valida per /langversion. Usare '/langversion:?' per elencare i valori supportati.
  • CS1638: 'identifier' è un identificatore riservato e non può essere usato quando viene usata la modalità di versione del linguaggio ISO
  • CS8192: la versione della lingua specificata non è supportata o non è valida: 'value'.
  • CS8303: La versione del linguaggio specificata 'value' non può avere zere iniziali
  • CS8304: versione del compilatore: 'version'. Versione della lingua: versione.

Questi errori indicano che l'impostazione <LangVersion> nel file di progetto o l'opzione del -langversion compilatore non è valida o incompatibile con il compilatore installato.

Correggere il <LangVersion> valore nel file di progetto in una stringa di versione della lingua valida (CS1617, CS8192, CS8303). I valori validi includono default, latestpreview, , latestMajoro un numero di versione specifico, ad esempio 7.3, 8.09.0101112, 13, o .14 Non includere zeri iniziali nel numero di versione. Per l'elenco completo dei valori supportati, vedere Controllo delle versioni del linguaggio C# .

Tip

Per visualizzare un elenco delle versioni del linguaggio supportate, fare riferimento alla tabella in questo articolo, compilare con -langversion:?o impostare <LangVersion>?</LangVersion> temporaneamente nel file di progetto prima della compilazione.

Aggiornare .NET SDK a una versione il cui compilatore supporta la versione del linguaggio specificata (CS8304). Ogni versione del compilatore C# supporta le versioni del linguaggio fino a un massimo specifico. Se si specifica una versione del linguaggio più recente rispetto al supporto del compilatore, aggiornare l'SDK.

Rimuovere identificatori di sottolineatura doppia o modificare la versione della lingua da ISO-1 o ISO-2 a una versione più recente (CS1638). Le modalità del linguaggio ISO riservano gli identificatori contenenti __ (caratteri di sottolineatura doppia) perché non sono conformi alla specifica ISO C#.

Note

Il compilatore C# corrente non produce più CS1638. I compilatori meno recenti hanno generato questo errore quando si usano le versioni del ISO-1 linguaggio o ISO-2 .

Il compilatore determina la versione predefinita del linguaggio dal framework di destinazione:

Destinazione Versione Impostazione predefinita della versione del linguaggio C#
.NET 11.x C# 15
.NET 10.x C# 14
.NET 9.x C# 13
.NET 8.x C# 12
.NET 7.x C# 11
.NET 6.x C# 10
.NET 5.x C# 9.0
.NET Core 3.x C# 8.0
.NET Core 2.x C# 7.3
.NET Standard 2.1 C# 8.0
.NET Standard 2.0 C# 7.3
.NET Standard 1.x C# 7.3
.NET Framework tutto C# 7.3

Se si rimuove l'elemento LangVersion dal file di progetto, il compilatore usa il valore predefinito per il framework di destinazione. È anche possibile specificare una versione specifica per abilitare le funzionalità più recenti:

Valore Significato
preview Il compilatore accetta tutte le sintassi di linguaggio valide dalla versione di anteprima più recente.
latest Il compilatore accetta la sintassi dalla versione rilasciata più recente del compilatore (inclusa la versione secondaria).
latestMajor
o default
Il compilatore accetta la sintassi dalla versione principale più recente rilasciata del compilatore.
15.0 Il compilatore accetta solo la sintassi inclusa in C# 15 o versione precedente.
14.0 Il compilatore accetta solo la sintassi inclusa in C# 14 o versione precedente.
13.0 Il compilatore accetta solo la sintassi inclusa in C# 13 o versione precedente.
12.0 Il compilatore accetta solo la sintassi inclusa in C# 12 o versione precedente.
11.0 Il compilatore accetta solo la sintassi inclusa in C# 11 o versione precedente.
10.0 Il compilatore accetta solo la sintassi inclusa in C# 10 o versione precedente.
9.0 Il compilatore accetta solo la sintassi inclusa in C# 9 o versione precedente.
8.0 Il compilatore accetta solo la sintassi inclusa in C# 8.0 o versione precedente.
7.3 Il compilatore accetta solo la sintassi inclusa in C# 7.3 o versione precedente.
7.2 Il compilatore accetta solo la sintassi inclusa in C# 7.2 o versione precedente.
7.1 Il compilatore accetta solo la sintassi inclusa in C# 7.1 o versione precedente.
7 Il compilatore accetta solo la sintassi inclusa in C# 7.0 o versione precedente.
6 Il compilatore accetta solo la sintassi inclusa in C# 6.0 o versione precedente.
5 Il compilatore accetta solo la sintassi inclusa in C# 5.0 o versione precedente.
4 Il compilatore accetta solo la sintassi inclusa in C# 4.0 o versione precedente.
3 Il compilatore accetta solo la sintassi inclusa in C# 3.0 o versione precedente.
ISO-2
o 2
Il compilatore accetta solo la sintassi inclusa nella specifica ISO/IEC 23270:2006 C# (2.0).
ISO-1
o 1
Il compilatore accetta solo la sintassi inclusa nella specifica ISO/IEC 23270:2003 C# (1.0/1.2).

Per altre informazioni sulle versioni del linguaggio supportate per ogni versione del framework, vedere Configurare la versione del linguaggio nella sezione di riferimento per il linguaggio.

Funzionalità non disponibile nella versione della lingua

  • CS1738: Le specifiche di argomenti denominati devono trovarsi dopo tutti gli argomenti fissi specificati.
  • CS8022, CS8023, CS8024, CS8025, CS8026, CS8059, CS8107, CS8302, CS8320, CS8370, CS8400, CS8773, CS8936, CS9058, CS9202, CS9260, CS9327: Funzionalità non disponibile in C# X. Usare la versione Y o successiva della lingua.
  • CS8306: viene dedotto il nome dell'elemento Tuple. Usare la lingua 7.1 o successiva per accedere a un elemento in base al nome dedotto.
  • CS8314: un'espressione di tipo 'type' non può essere gestita da un modello di tipo 'type' nella versione C#. Usare la versione della lingua 'version' o versione successiva.
  • CS8371: gli attributi di destinazione del campo sulle proprietà automatiche non sono supportati nella lingua versione 7.3.
  • CS8401: per usare '@$' anziché '$@' per una stringa verbatim interpolata, usare la versione della lingua 8.0 o successiva.
  • CS8511: Un'espressione di tipo 'type' non può essere gestita da un criterio di tipo 'type'. Usare la versione del linguaggio 'version' o successiva per trovare una corrispondenza tra un tipo aperto e un criterio costante.
  • CS8627: un parametro di tipo nullable deve essere noto come tipo valore o tipo riferimento non nullable a meno che non venga usata la versione del linguaggio 'version' o versione successiva. Prendere in considerazione la modifica della versione del linguaggio o l'aggiunta di un vincolo 'class', 'struct' o type.
  • CS8630: Valore 'option' non valido: 'value' per la versione di C#. Usare la versione del linguaggio 'version' o successiva.
  • CS8703: Il modificatore 'modifier' non è valido per questo elemento nella versione di C#.
  • CS8704: 'type' non implementa il membro dell'interfaccia 'member'. 'type' non può implementare in modo implicito un membro non pubblico.
  • CS8706: tipo non può implementare il membro dell'interfaccia perché la funzionalità non è disponibile in questa versione.
  • CS8904: varianza non valida: il parametro di tipo deve essere invariantemente valido in 'member' a meno che non venga usata la versione 9.0 o successiva della lingua.
  • CS8912: La derivazione da un record con 'Object.ToString' sealed non è supportata in C# 9.0.
  • CS8957: l'espressione condizionale non è valida nella versione 8.0 del linguaggio perché non è stato trovato un tipo comune tra i tipi.
  • CS8967: le nuove righe all'interno di una stringa interpolata non verbatim non sono supportate in C# 10.0.
  • CS9194: l'argomento potrebbe non essere passato con la parola chiave 'ref'. Per passare gli argomenti 'ref' ai parametri 'in', eseguire l'aggiornamento alla versione 12 o successiva della lingua.

Tutti questi errori indicano che si usa una funzionalità del linguaggio che richiede una versione C# più recente rispetto al progetto attualmente destinato. Per risolvere questi errori, usare una delle opzioni seguenti:

  • Aggiornare il framework di destinazione in modo che il compilatore selezioni automaticamente la versione del linguaggio richiesta. Ogni framework di destinazione corrisponde a una versione predefinita di C#. Ad esempio, .NET 8 usa C# 12 per impostazione predefinita, .NET 9 usa C# 13 per impostazione predefinita e .NET 10 usa C# 14 per impostazione predefinita. Per il mapping completo, vedere la tabella in Errori di configurazione della versione del linguaggio .

  • Impostare l'elemento <LangVersion> nel file di progetto sulla versione richiesta o successiva. Ad esempio, per abilitare le funzionalità di C# 12, aggiungere <LangVersion>12</LangVersion> a un elemento <PropertyGroup> nel file di progetto.

Se non è possibile eseguire l'aggiornamento, evitare la funzionalità che ha attivato l'errore. Il messaggio di errore denomina la funzionalità e la versione richiesta. L'elenco seguente fornisce un contesto aggiuntivo per errori specifici:

  • Usa argomenti con nome esplicito per tutti gli argomenti oppure passa a C# 7.2 o a una versione successiva per usare argomenti con nome non finali (CS1738).
  • Accedere agli elementi della tupla in base al nome dichiarato anziché al nome dedotto o eseguire l'aggiornamento a C# 7.1 o versione successiva (CS8306).
  • Usare $@"..." invece di @$"..." per le stringhe verbatim interpolate nelle versioni C# precedenti alla 8.0 (CS8401).
  • Aggiungere vincoli di tipo espliciti a parametri di tipo nullable o eseguire l'aggiornamento a C# 9 o versione successiva, che riduce questo requisito (CS8627).
  • Eseguire l'aggiornamento a C# 8.0 o versione successiva per abilitare le annotazioni nullable e il contesto nullable (CS8630).
  • Aggiungi cast espliciti nelle espressioni condizionali in cui i due rami non hanno un tipo comune, oppure passa a C# 9 o versione successiva per usare espressioni condizionali con tipo di destinazione (CS8957).
  • Spostare le nuove righe all'esterno delle espressioni di stringa interpolate o eseguire l'aggiornamento a C# 11 o versione successiva (CS8967).
  • Usare la parola chiave in anziché ref quando si passano argomenti ai parametri in, oppure eseguire l'aggiornamento a C# 12 o versione successiva (CS9194).
  • Implementare membri di interfaccia non pubblici in modo esplicito anziché in modo implicito o eseguire l'aggiornamento a C# 9 o versione successiva (CS8704).

Il runtime di destinazione non supporta la funzionalità

  • CS8021: Non è stato trovato alcun valore per RuntimeMetadataVersion.
  • CS8701: il runtime di destinazione non supporta l'implementazione dell'interfaccia predefinita.
  • CS8702: 'member' non può implementare il membro dell'interfaccia nel tipo perché il runtime di destinazione non supporta l'implementazione dell'interfaccia predefinita.
  • CS8707: Il runtime di destinazione non supporta i livelli di accesso 'protected', 'protected internal' o 'private protected' per un membro di un'interfaccia.
  • CS8830: Il runtime di destinazione non supporta i tipi di restituzione covarianti nelle ridefinizioni.
  • CS8831: L'ambiente di runtime di destinazione non supporta i tipi covarianti negli override.
  • CS8889: il runtime di destinazione non supporta le convenzioni di chiamata predefinite estendibili o dell'ambiente di runtime.
  • CS8919: il runtime di destinazione non supporta membri astratti statici nelle interfacce.
  • CS8929: 'method' non può implementare il membro di interfaccia 'member' nel tipo 'type' perché il runtime di destinazione non supporta membri astratti statici nelle interfacce.
  • CS9041: 'type' richiede la funzionalità del compilatore 'feature', che non è supportata da questa versione del compilatore C#.
  • CS9064: Il runtime di destinazione non supporta i campi ref.
  • CS9103: 'type' è definito in un modulo con una versione non riconosciuta di RefSafetyRulesAttribute; è prevista la versione '11'.
  • CS9171: Il runtime di destinazione non supporta i tipi di matrice inline.
  • CS9240: Il runtime di destinazione non supporta generici simili a by-ref.
  • CS9328: il metodo 'method' usa attualmente una funzionalità non supportata dal runtime asincrono. Rifiutare esplicitamente il metodo dall'asincrona di runtime assegnandolo a 'System.Runtime.CompilerServices.RuntimeAsyncMethodGenerationAttribute(false)'.
  • CS9346: l'aggiornamento richiede l'implementazione esplicita dell'interfaccia, che non è supportata dal runtime senza riavviare l'applicazione.
  • CS9352: il runtime di destinazione non supporta i tipi di layout estesi.

Questi errori differiscono dagli errori di versione della lingua perché l'aggiornamento <LangVersion> da solo non li risolve. Il runtime di destinazione (specificato da <TargetFramework>) deve supportare anche la funzionalità a livello di CLR/runtime.

Aggiorna <TargetFramework> nel file di progetto a una versione che supporti la funzionalità richiesta. L'elenco seguente mostra le funzionalità che richiedono il runtime minimo:

  • Implementazione dell'interfaccia predefinita, incluso l'accesso protetto (CS8701, CS8702, CS8707): richiede .NET Core 3.0 / .NET 5+.
  • Membri astratti statici nelle interfacce (CS8919, CS8929): richiede .NET 7+.
  • Tipi restituiti covarianti (CS8830, CS8831): richiede .NET 5 o versione successiva.
  • Campi di riferimento (CS9064): richiede .NET 7+.
  • Tipi di matrice inline (CS9171): richiede .NET 8+.
  • Tipi generici simili ai riferimenti (CS9240): richiede .NET 9+.
  • Tipi di layout estesi (CS9352): richiede .NET 10+.
  • Convenzioni di chiamata estendibili (CS8889): richiede .NET 5+.
  • Funzionalità asincrone di runtime (CS9328): richiede .NET 10+.

Aggiornare .NET SDK se il compilatore stesso non supporta una funzionalità del compilatore obbligatoria (CS9041). Questo errore indica che una libreria a cui si fa riferimento usa le funzionalità dei metadati che richiedono una versione più recente del compilatore.

Verificare che esista un riferimento valido alla libreria di runtime principale (CS8021). Questo avviso viene in genere visualizzato durante la compilazione senza un riferimento di runtime standard. Specificare un'opzione RuntimeMetadataVersion o aggiungere un riferimento a un assembly contenente System.Object.

Risolvere RefSafetyRulesAttribute le mancate corrispondenze della versione ricompilando i moduli dipendenti con una versione compatibile del compilatore (CS9103).

Riavviare l'applicazione se si verifica questo errore durante il ricaricamento rapido (CS9346). Alcune modifiche di modifica e continuazione richiedono il riavvio perché il runtime non può generare in modo dinamico le implementazioni di interfaccia esplicite necessarie.

Errori relativi al puntatore di funzione e alla convenzione di chiamata

  • CS8888: la convenzione di chiamata "gestita" non può essere combinata con gli identificatori di convenzione di chiamata non gestiti.
  • CS8889: il runtime di destinazione non supporta le convenzioni di chiamata predefinite estendibili o dell'ambiente di runtime.
  • CS8890: il tipo 'type' non è definito.
  • CS8891: il tipo 'type' deve essere pubblico per essere usato come convenzione di chiamata.

Questi errori si riferiscono alle dichiarazioni del puntatore di funzione e ai relativi identificatori di convenzione di chiamata, introdotti in C# 9.

Rimuovere managed dagli elenchi di identificatori di convenzione di chiamata che includono anche identificatori non gestiti (CS8888). La managed convenzione di chiamata è l'impostazione predefinita e non può essere combinata con unmanaged identificatori come Cdecl, StdcallThiscall, o Fastcall.

Aggiornare il framework di destinazione a .NET 5 o versione successiva per usare convenzioni di chiamata estendibili o predefinite per il runtime (CS8889). L'attributo UnmanagedCallersOnly e i tipi di convenzione di chiamata estendibili richiedono il supporto del runtime, che non è disponibile in .NET Core 3.1 o versioni precedenti.

Verificare che il tipo di convenzione di chiamata esista negli assembly a cui si fa riferimento (CS8890). I tipi di convenzione di chiamata come CallConvCdecl, CallConvStdcall, CallConvThiscall e CallConvFastcall sono definiti in System.Runtime.CompilerServices. Se il tipo non viene trovato, aggiungere un riferimento alla libreria di runtime corretta.

Impostare tipi di convenzione di public chiamata personalizzati (CS8891). Se si definisce un tipo di convenzione di chiamata personalizzato, dichiararlo come public per usarlo in una dichiarazione di tipo di puntatore a funzione.

Funzionalità sperimentali e di anteprima

  • CS8058: la funzionalità 'feature' è sperimentale e non supportata. Usare '/features:feature' per abilitare.
  • CS8305: "type" è solo a scopo di valutazione ed è soggetto a modifiche o rimozione negli aggiornamenti futuri.
  • CS8652: la funzionalità è attualmente in anteprima e non supportata. Per usare le funzionalità di anteprima, usare la versione della lingua 'preview'.
  • CS9204: 'type' è solo a scopo di valutazione ed è soggetto a modifiche o rimozione negli aggiornamenti futuri. Eliminare questa diagnostica per continuare.
  • CS9211: L'argomento diagnosticId dell'attributo 'Experimental' deve essere un identificatore valido.
  • CS9268: 'type' è solo a scopo di valutazione ed è soggetto a modifiche o rimozione negli aggiornamenti futuri: 'message'. Eliminare questa diagnostica per continuare.

Questa diagnostica indica che si usa una funzionalità o un tipo contrassegnato come sperimentale o disponibile solo nella versione del linguaggio di anteprima.

Avviso

Le funzionalità sperimentali sono soggette a modifiche. Le API potrebbero cambiare o potrebbero essere rimosse negli aggiornamenti futuri. L'inclusione di funzionalità sperimentali è un modo per consentire agli autori di librerie di ottenere feedback su idee e concetti per lo sviluppo futuro. Prestare particolare attenzione quando si usa qualsiasi funzionalità contrassegnata come sperimentale.

Impostare <LangVersion>preview</LangVersion> nel file di progetto per usare le funzionalità del linguaggio di anteprima (CS8652). Le funzionalità di anteprima non sono ancora state completate e potrebbero cambiare nelle versioni future.

Eliminare l'ID di diagnostica specifico per confermare la natura sperimentale dell'API (CS8058, CS8305, CS9204, CS9268). Gli autori di librerie contrassegnano le API con System.Diagnostics.CodeAnalysis.ExperimentalAttribute per indicare che sono soggette a modifiche. È possibile eliminare la diagnostica usando #pragma warning disable o aggiungendo l'ID di diagnostica a <NoWarn> nel file di progetto.

Verificare che l'argomento diagnosticId di [Experimental] sia un identificatore C# valido (CS9211). L'identificatore deve seguire le regole di denominazione standard. Non può contenere spazi, caratteri speciali o iniziare con una cifra. È anche possibile dichiarare le proprie funzionalità sperimentali usando .System.Diagnostics.CodeAnalysis.ExperimentalAttribute

Modifiche dirompenti nell'inizializzazione dello struct

  • CS0171, CS8881: il campo 'name' deve essere inizializzato completamente prima di restituire il controllo al chiamante. Valutare l'aggiornamento alla versione del linguaggio 'version' per impostare automaticamente il valore predefinito del campo.
  • CS0188, CS8885: Impossibile utilizzare l'oggetto 'this' prima che tutti i relativi campi siano stati assegnati. Prendere in considerazione l'aggiornamento alla versione della lingua 'version' per impostazione predefinita automatica dei campi non assegnati.
  • CS0843, CS8880: la proprietà 'name' implementata automaticamente deve essere assegnata completamente prima che il controllo venga restituito al chiamante. Prendere in considerazione l'aggiornamento alla versione della lingua 'version' per l'impostazione predefinita automatica della proprietà.
  • CS9014: Uso della proprietà autoimplementata 'name' possibilmente non assegnata. Valutare l'aggiornamento alla versione del linguaggio 'version' per assegnare automaticamente un valore predefinito alla proprietà.
  • CS9015: Uso del campo 'name' potenzialmente non assegnato. Valutare l'aggiornamento alla versione del linguaggio 'version' per impostare automaticamente un valore predefinito per il campo.
  • CS9016: Uso della proprietà autoimplementata probabilmente non assegnata 'name'. Valutare l'aggiornamento alla versione del linguaggio 'version' per inizializzare automaticamente la proprietà con il valore predefinito.
  • CS9017: Uso del campo 'name' potenzialmente non assegnato. Considerare l'aggiornamento alla versione del linguaggio 'version' per inizializzare automaticamente il campo.

Questi errori e avvisi contribuiscono a garantire che i tipi struct vengano inizializzati correttamente prima che si acceda ai loro campi. Nelle versioni precedenti di C# è necessario assegnare in modo esplicito tutti i campi in uno struct in qualsiasi costruttore. Il costruttore senza parametri inizializza tutti i campi sul valore predefinito. Nelle versioni successive tutti i costruttori inizializzano tutti i campi. Il campo viene impostato in modo esplicito, impostato in un inizializzatore di campo o impostato sul valore predefinito.

Aggiornare a C# 11 o versione successiva in modo che tutti i costruttori struct inizializzino automaticamente tutti i campi ai valori predefiniti (CS0171, CS0188, CS0843 e le rispettive controparti più recenti CS8880, CS8881, CS8885). A partire da C# 11, il compilatore inizializza automaticamente tutti i campi non impostati in modo esplicito in un costruttore sui valori predefiniti.

Chiamare in modo esplicito il costruttore predefinito usando : this() nel costruttore struct se non è possibile eseguire l'aggiornamento a C# 11 (CS0171, CS0188, CS0843). Questo approccio garantisce che tutti i campi ricevano i valori predefiniti prima che venga eseguito il corpo del costruttore:

struct S
{
    public int AIProp { get; set; }
    public S(int i) : this() // Ensures all fields are initialized
    {
        AIProp = i;
    }
}

Assegnare tutti i campi e le proprietà automatiche prima di usare this o prima che il costruttore restituisca (CS9014, CS9015, CS9016, CS9017). Questi dati di diagnostica vengono visualizzati quando un compilatore più recente rileva che è possibile leggere una proprietà o un campo prima che sia stato assegnato. Assegnare in modo esplicito un valore o eseguire l'aggiornamento a una versione in cui l'impostazione predefinita automatica elimina l'avviso.

Attributi specifici dell'implementazione

  • CS9269: UnscopedRefAttribute è valido solo in C# 11 o versione successiva o quando la destinazione è net7.0 o versione successiva.
  • CS9271: Il tipo 'Microsoft. CodeAnalysis.EmbeddedAttribute' deve essere non generico, interno, non file, sealed, non statico, avere un costruttore senza parametri, ereditare da System.Attribute e poter essere applicato a qualsiasi tipo.

Questi errori si riferiscono agli attributi generati dal compilatore o associati a versioni di runtime specifiche.

Eseguire l'aggiornamento a C# 11 e .NET 7 o versione successiva per usare UnscopedRefAttribute (CS9269). Questo attributo indica che un valore restituito ref o un parametro ref struct non ha un ciclo di vita con ambito. Richiede sia la versione del linguaggio che il framework di destinazione per soddisfare i requisiti minimi.

Non dichiarare manualmente Microsoft.CodeAnalysis.EmbeddedAttribute (CS9271). Il compilatore genera automaticamente l'origine per questo attributo quando necessario. Se si dispone di un tipo dichiarato manualmente con questo nome, rimuoverlo o rinominarlo per evitare conflitti con la versione generata dal compilatore.