Opzioni del compilatore C# per le regole delle funzionalità del linguaggio

Le opzioni seguenti controllano il modo in cui il compilatore interpreta le funzionalità del linguaggio. La nuova sintassi di MSBuild viene visualizzata in grassetto. La sintassi di csc.exe precedente è mostrata in code style.

  • CheckForOverflowUnderflow / -checked: generare controlli di overflow.
  • AllowUnsafeBlocks / -unsafe: consentire il codice non gestito.
  • DefineConstants / -define: definire i simboli di compilazione condizionale.
  • LangVersion / -langversion: specificare la versione del linguaggio, ad esempio default (versione principale più recente) o latest (versione più recente, incluse le versioni secondarie).
  • Nullable / -nullable: abilitare il contesto che ammette i valori Null o avvisi che ammettono i valori Null.

CheckForOverflowUnderflow

L'opzione CheckForOverflowUnderflow controlla il contesto di controllo dell'overflow predefinito che definisce il comportamento del programma in presenza di overflow aritmetici di integer.

<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>

Quando CheckForOverflowUnderflow è true, il contesto predefinito è un contesto controllato e il controllo dell'overflow è abilitato. In caso contrario, il contesto predefinito è un contesto non controllato. Il valore predefinito per questa opzione è false, ovvero il controllo dell'overflow è disabilitato.

È anche possibile controllare in modo esplicito il contesto di controllo dell'overflow per le parti del codice usando le istruzioni checked e unchecked.

Per informazioni su come il contesto di controllo dell'overflow influisce sulle operazioni e sulle operazioni interessate, vedere l'articolo sulle istruzioni checked e unchecked.

AllowUnsafeBlocks

L'opzione del compilatore AllowUnsafeBlocks consente la compilazione del codice che usa la parola chiave unsafe. Il valore predefinito per questa opzione è false, ovvero il codice non gestito non è consentito.

<AllowUnsafeBlocks>true</AllowUnsafeBlocks>

Per altre informazioni sul codice unsafe, vedere Codice unsafe e puntatori.

DefineConstants

L'opzione DefineConstants definisce i simboli in tutti i file di codice sorgente del programma.

<DefineConstants>name;name2</DefineConstants>

Questa opzione specifica i nomi di uno o più simboli da definire. L'opzione DefineConstants ha lo stesso effetto dell'uso della direttiva #define per il preprocessore, ad eccezione del fatto che l'opzione del compilatore è valida per tutti i file nel progetto. Un simbolo resta definito in un file del codice sorgente finché una direttiva #undef nel file non rimuove la definizione. Quando si usa l'opzione -define, una direttiva #undef in un file non ha effetto in altri file del codice sorgente nel progetto. È possibile usare i simboli creati da questa opzione con #if, #else, #elif e #endif per la compilazione condizionale dei file del codice sorgente. Il compilatore C# stesso non definisce alcun simbolo o macro che è possibile usare nel codice sorgente. Tutte le definizioni dei simboli devono essere definite dall'utente.

Nota

La direttiva #define in C# non consente di assegnare un valore a un simbolo, diversamente dai linguaggi come C++. Ad esempio, non è possibile usare #define per creare una macro o per definire una costante. Se è necessario definire una costante, usare una variabile enum. Se si vuole creare una macro in stile C++, prendere in considerazione altre alternative, ad esempio i generics. Poiché le macro sono notoriamente soggette a errori, C# non ne consente l'uso, ma offre alternative più sicure.

LangVersion

La versione del linguaggio predefinita per il compilatore C# dipende dal framework di destinazione per l'applicazione e dalla versione dell'SDK o di Visual Studio installata. Queste regole sono definite nel controllo delle versioni del linguaggio C#.

L'opzione LangVersion fa sì che il compilatore accetti solo la sintassi inclusa nella specifica del linguaggio C# specificata, ad esempio:

<LangVersion>9.0</LangVersion>

I valori validi sono i seguenti:

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.
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).

Importante

Il valore latest in genere non è consigliato. Con latest, il compilatore abilita le funzionalità più recenti, anche se queste funzionalità dipendono da aggiornamenti non inclusi nel framework di destinazione configurato.

Considerazioni

  • Per assicurarsi che il progetto usi la versione del compilatore predefinita consigliata per il framework di destinazione, non usare l'opzione LangVersion. È possibile aggiornare il framework di destinazione per accedere alle funzionalità del linguaggio più recenti.

  • Specificare LangVersion con il valore default è diverso dall'omissione dell'opzione LangVersion. Specificando default viene utilizzata la versione più recente del linguaggio supportata dal compilatore, senza tenere conto del framework di destinazione. Ad esempio, la compilazione di un progetto destinato a .NET 6 da Visual Studio 17.6 usa C# 10 se non si specifica l'opzione LangVersion, ma usa C# 11 se LangVersion è impostata su default.

  • I metadati a cui viene fatto riferimento nell'applicazione C# non sono soggetti all'opzione del compilatore LangVersion.

  • Poiché ogni versione del compilatore C# contiene estensioni per la specifica del linguaggio, LangVersion non offre la funzionalità equivalente di una versione precedente del compilatore.

  • Mentre gli aggiornamenti di versione di C# coincidono in genere con le versioni principali di .NET, la nuova sintassi e le nuove funzionalità non sono necessariamente associate alla versione specifica del framework. Ogni funzionalità specifica presenta requisiti minimi in termini di API .NET o Common Language Runtime che ne consentono l'esecuzione in versioni di framework di livello inferiore, inclusi pacchetti NuGet o altre librerie.

  • Indipendentemente dall'impostazione di LangVersion specificata, per creare il file con estensione exe o dll viene usata la versione corrente di Common Language Runtime. Un'eccezione è costituita dagli assembly Friend e da ModuleAssemblyName, che vengono eseguiti con -langversion:ISO-1.

Per altri metodi per la specifica della versione del linguaggio C#, vedere Controllo delle versioni del linguaggio C#.

Per informazioni su come impostare questa opzione del compilatore a livello di codice, vedere LanguageVersion.

Specifiche del linguaggio C#

Versione Collega Descrizione
C# 8.0 e versioni successive Download PDF Specifica del linguaggio C# versione 7: .NET Foundation
C# 7.3 Download PDF Standard ECMA-334, settima edizione
C# 6.0 Download PDF Standard ECMA-334, sesta edizione
C# 5.0 Scarica PDF Standard ECMA-334, quinta edizione
C# 3.0 Scaricare DOC Specifica del linguaggio C# versione 3.0: Microsoft Corporation
C# 2.0 Scarica PDF Standard ECMA-334, quarta edizione
C# 1.2 Scaricare DOC Standard ECMA-334, seconda edizione
C# 1.0 Scaricare DOC Standard ECMA-334, prima edizione

Versione minima dell'SDK necessaria per supportare tutte le funzionalità del linguaggio

La tabella seguente elenca le versioni minime dell'SDK con il compilatore C# che supporta la versione del linguaggio corrispondente:

Versione C# Versione minima di SDK
C# 12 Microsoft Visual Studio/Build Tools 2022 versione 17.8 o .NET 8 SDK
C# 11 Microsoft Visual Studio/Build Tools 2022 versione 17.4 o .NET 7 SDK
C# 10 Microsoft Visual Studio/Build Tools 2022 o .NET 6 SDK
C# 9.0 Microsoft Visual Studio/Build Tools 2019 versione 16.8 o .NET 5 SDK
C# 8.0 Microsoft Visual Studio/Build Tools 2019 versione 16.3 o .NET Core 3.0 SDK
C# 7.3 Microsoft Visual Studio/Build Tools 2017 versione 15.7
C# 7.2 Microsoft Visual Studio/Build Tools 2017 versione 15.5
C# 7.1 Microsoft Visual Studio/Build Tools 2017 versione 15.3
C# 7.0 Microsoft Visual Studio/Build Tools 2017
C# 6 Microsoft Visual Studio/Build Tools 2015
C# 5 Microsoft Visual Studio/Build Tools 2012 o compilatore di .Net Framework 4.5 in bundle
C# 4 Microsoft Visual Studio/Build Tools 2010 o compilatore di .Net Framework 4.0 in bundle
C# 3 Microsoft Visual Studio/Build Tools 2008 o compilatore di .Net Framework 3.5 in bundle
C# 2 Microsoft Visual Studio/Build Tools 2005 o compilatore di .Net Framework 2.0 in bundle
C# 1.0/1.2 Microsoft Visual Studio/Build Tools .NET 2002 o compilatore di .NET Framework 1.0 in bundle

Nullable

L'opzione Nullable consente di specificare il contesto che ammette i valori Null. Può essere impostata nella configurazione del progetto usando il tag <Nullable>:

<Nullable>enable</Nullable>

L'argomento deve essere enable, disable, warnings o annotations. L'argomento enable abilita il contesto che ammette i valori Null. Se si specifica disable, il contesto che ammette i valori Null verrà disabilitato. Quando si specifica l'argomento warnings, viene abilitato il contesto di avviso che ammette i valori Null. Quando si specifica l'argomento annotations, viene abilitato il contesto di annotazione che ammette i valori Null. I valori sono descritti e illustrati nell'articolo Contesti che ammettono i valori Null. Per altre informazioni sulle attività coinvolte nell'abilitazione dei tipi riferimento che ammettono i valori Null in una codebase esistente, vedere l'articolo sulle strategie di migrazione per i tipi che ammettono valori Null.

Nota

Quando non è impostato alcun valore, viene applicato il valore predefinito disable. Tuttavia i modelli .NET 6 vengono forniti per impostazione predefinita con il valore Nullable impostato su enable.

L'analisi del flusso viene usata per dedurre il supporto dei valori Null delle variabili all'interno del codice eseguibile. Il supporto dei valori Null dedotto di una variabile è indipendente dal supporto dei valori Null dichiarato della variabile. Le chiamate ai metodi vengono analizzate anche quando vengono omesse in modo condizionale. Ad esempio, Debug.Assert in modalità di rilascio.

La chiamata dei metodi annotati con gli attributi seguenti influirà anche sull'analisi del flusso:

Importante

Il contesto che ammette i valori Null globale non si applica ai file di codice generati. Indipendentemente da questa impostazione, il contesto che ammette i valori Null viene disabilitato per qualsiasi file di origine contrassegnato come generato. Esistono quattro modi in cui un file viene contrassegnato come generato:

  1. In .editorconfig specificare generated_code = true in una sezione che si applica a tale file.
  2. Inserire <auto-generated> o <auto-generated/> in un commento all'inizio del file. Può trovarsi in qualsiasi riga di tale commento, ma il blocco di commento deve essere il primo elemento del file.
  3. Iniziare il nome del file con TemporaryGeneratedFile_
  4. Terminare il nome del file con .designer.cs, .generated.cs, .g.cs o .g.i.cs.

I generatori possono acconsentire esplicitamente usando la direttiva del preprocessore #nullable.