Risolvere gli avvisi correlati alle funzionalità e alle versioni del linguaggio
Questo articolo illustra gli avvisi del compilatore seguenti:
- CS8022, CS8023, CS8024, CS8025, CS8026, CS8059, CS8107, CS8302, CS8320, CS8370, CS8400, CS8773, CS8936, CS9058: Funzionalità non disponibile. Usare la versione più recente del linguaggio.
- CS8058: La funzionalità è sperimentale.
- CS8192: La versione specificata del linguaggio non è supportata o non è valida
- CS8303: La versione specificata del linguaggio non può contenere zeri iniziali
- CS8304: La versione del compilatore è minore della versione del linguaggio
- CS1738: Le specifiche di argomenti denominati devono trovarsi dopo tutti gli argomenti fissi specificati.
- CS8306: Il nome dell'elemento tupla viene dedotto.
- CS8314: Un'espressione di tipo non può essere gestita da un criterio di tipo
- CS8371: Gli attributi destinati a campi su proprietà automatiche non sono supportati nella versione del linguaggio
- CS8401: Per usare
@$
invece di$@
per una stringa verbatim interpolata, usare la versione più recente del linguaggio. - CS8511: Un'espressione di tipo non può essere gestita da un criterio di tipo.
- CS8627: Il parametro di tipo che ammette i valori Null deve essere noto come tipo valore o tipo riferimento che non ammette i valori Null
- CS8630: Opzioni che ammettono i valori Null non valide. Usare la versione più recente del linguaggio
- CS8652: Il modificatore non è valido per questo elemento.
- CS8704: Il tipo non implementa il membro dell'interfaccia. Non può implementare in modo implicito un membro non pubblico.
- CS8706: Il tipo non può implementare il membro dell'interfaccia perché una funzionalità non è disponibile in questa versione.
- CS8904: Varianza non valida: il parametro di tipo deve essere valido.
- CS8912: L'ereditarietà da un record con un 'Object.ToString' sealed non è supportata.
- CS8919: Non è possibile implementare il membro di interfaccia specificato nel tipo perché il runtime di destinazione non supporta membri astratti statici nelle interfacce
- CS8929: Il metodo non può implementare il membro di interfaccia nel tipo perché il runtime di destinazione non supporta membri astratti statici nelle interfacce.
- CS8957: L'espressione condizionale non è valida nella versione 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#
- CS9014: Errore: uso di una proprietà probabilmente non assegnata. Eseguire l'aggiornamento per applicare automaticamente l'impostazione predefinita alla proprietà.
- CS9015: Errore: uso di un campo probabilmente non assegnato. Eseguire l'aggiornamento per applicare automaticamente l'impostazione predefinita al campo.
- CS9016: Avviso: uso di una proprietà probabilmente non assegnata. Eseguire l'aggiornamento per applicare automaticamente l'impostazione predefinita alla proprietà.
- CS9017: Avviso: uso di un campo probabilmente non assegnato. Eseguire l'aggiornamento per applicare automaticamente l'impostazione predefinita al campo.
- CS9064: Il runtime di destinazione non supporta i campi ref.
- CS9103: Definizione in un modulo con una versione RefSafetyRulesAttribute non riconosciuta. Valore previsto: '11'.
- CS9171: Il runtime di destinazione non supporta i tipi di matrice inline.
- CS9194: È possibile che l'argomento non venga passato con la parola chiave
ref
. Per passare argomentiref
ai parametriin
, eseguire l'aggiornamento alla versione 12 o successiva del linguaggio. - CS9202: La funzionalità non è disponibile in C# 12.0. Usare la versione più recente del linguaggio
- CS9211: L'argomento diagnosticId dell'attributo 'Experimental' deve essere un identificatore valido.
- CS9240: Il runtime di destinazione non supporta generici simili a by-ref.
- CS9260: la funzionalità non è disponibile in C# 13.0. Usare la versione più recente della lingua*
Gli errori e gli avvisi seguenti sono inoltre correlati alle modifiche all'inizializzazione degli struct nelle versioni recenti:
- CS0171, CS8881: Il campo sottostante per la proprietà implementata automaticamente 'name' deve essere assegnato completamente prima che il controllo venga restituito al chiamante.
- CS0188, CS8885: Non è possibile usare l'oggetto 'this' prima dell'assegnazione di tutti i campi dell'oggetto
- CS0843, CS8880: Il campo sottostante per la proprietà implementata automaticamente 'name' deve essere assegnato completamente prima che il controllo venga restituito al chiamante
- CS8305: La funzionalità è disponibile solo a scopo di valutazione e potrebbe essere modificata o rimossa in aggiornamenti futuri.
- CS9204: Il tipo è disponibile solo a scopo di valutazione e potrebbe essere modificato o rimosso in aggiornamenti futuri. Eliminare questa diagnostica per continuare.
La causa di tutti questi errori e avvisi è che il compilatore installato supporta una versione più recente di C# rispetto alla versione selezionata dal progetto. Il compilatore C# può essere conforme a qualsiasi versione precedente. È possibile convalidare la sintassi rispetto a una versione precedente di C# o perché il progetto deve supportare librerie o runtime meno recenti.
Esistono due possibili cause e tre modi per risolvere questi errori e avvisi.
Aggiornare il framework di destinazione
Il compilatore determina un'impostazione predefinita in base a queste regole:
Destinazione | Versione | Impostazione predefinita della versione del linguaggio C# |
---|---|---|
.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 il framework selezionato non corrisponde alla versione del linguaggio necessaria, è possibile aggiornare il framework di destinazione.
Selezionare la versione corrispondente del linguaggio
È possibile che nel file di progetto sia selezionato un framework di destinazione precedente. Se si rimuove l'elemento LangVersion
dal file di progetto, il compilatore usa il valore predefinito elencato nella sezione precedente. La tabella seguente illustra tutte le versioni del linguaggio C# correnti. È anche possibile specificare una versione specifica del linguaggio 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. |
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 l'articolo su Configurare la versione del linguaggio nella sezione relativa alle informazioni di riferimento sul linguaggio.
Evitare la funzionalità aggiornata
Se è necessario supportare librerie o runtime meno recenti, potrebbe essere necessario evitare di usare le funzionalità più recenti.
Abilitare le funzionalità sperimentali
La diagnostica per le funzionalità sperimentali può essere disabilitata per l'uso della funzionalità sperimentale.
Avviso
Le funzionalità sperimentali sono soggette a modifiche. Le API possono 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.
È anche possibile dichiarare le proprie funzionalità sperimentali usando l'attributo System.Diagnostics.CodeAnalysis.ExperimentalAttribute. Il compilatore genera CS9211 se l'identificatore usato per la funzionalità sperimentale non è un identificatore valido.
Modifiche che causano un'interruzione per l'inizializzazione dello struct
Tutti questi errori e avvisi consentono di assicurarsi che i tipi struct
vengano inizializzati correttamente prima dell'accesso ai relativi 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.
- CS0171, CS8881: Il campo sottostante per la proprietà implementata automaticamente 'name' deve essere assegnato completamente prima che il controllo venga restituito al chiamante.
- CS0188, CS8885: Non è possibile usare l'oggetto 'this' prima dell'assegnazione di tutti i campi dell'oggetto
- CS0843, CS8880: Il campo sottostante per la proprietà implementata automaticamente 'name' deve essere assegnato completamente prima che il controllo venga restituito al chiamante
È possibile risolvere questo errore aggiornando la versione del linguaggio a C# 11. Ogni costruttore struct
inizializza tutti i campi. Se questa non è un'opzione possibile, è necessario chiamare in modo esplicito il costruttore predefinito, come illustrato nell'esempio seguente:
struct S
{
public int AIProp { get; set; }
public S(int i){} //CS0843
// Try the following lines instead.
// public S(int i) : this()
// {
// AIProp = i;
// }
}
class Test
{
static int Main()
{
return 1;
}
}