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: consenti / -unsafeunsafe il codice.
  • 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.

Nota

Per altre informazioni sulla configurazione di queste opzioni per il progetto, vedere Opzioni del compilatore.

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. Quando CheckForOverflowUnderflow è false, il contesto predefinito è un contesto deselezionato. Il valore predefinito per questa opzione è false, il che significa che il controllo dell'overflow è disabilitato.

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

Per informazioni sul modo in cui il contesto di controllo dell'overflow influisce sulle operazioni e sulle operazioni che influisce, vedere l'articolo sulle checked istruzioni 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.

Abilitare le regole di sicurezza della memoria aggiornate

Le regole di sicurezza della memoria aggiornate sono una funzionalità di anteprima in C# 15 e .NET 11. Usano due impostazioni indipendenti del compilatore:

  • La versione del preview linguaggio consente il nuovo relax della sintassi e del puntatore.
  • La updated-memory-safety-rules funzionalità del compilatore abilita le regole aggiornate, inclusi gli obblighi del chiamante non sicuro e fa in modo che il compilatore registri la scelta nell'assembly con l'attributo MemorySafetyRulesAttribute .

Una futura proprietà DELL'SDK stabile, MemorySafetyRules, è pianificata come terzo livello di attivazione per quando la funzionalità esce dall'anteprima (ad esempio, <MemorySafetyRules>2</MemorySafetyRules>), ma tale proprietà non è ancora implementata.

Per un progetto, usare entrambe le impostazioni:

<PropertyGroup>
  <LangVersion>preview</LangVersion>
  <Features>$(Features);updated-memory-safety-rules</Features>
</PropertyGroup>

Per un programma basato su file, aggiungere le direttive equivalenti:

#:property Features=$(Features);updated-memory-safety-rules
#:property LangVersion=preview

La proprietà AllowUnsafeBlocks è indipendente. Controlla se l'origine può usare la unsafe parola chiave . Un progetto può abilitare le regole aggiornate senza consentire codice non sicuro, nel qual caso riceve errori quando chiama api non sicure.

Se un assembly applica le regole aggiornate a un altro dipende da quale lato acconsente esplicitamente:

  • Chiamante del modello aggiornato, chiamato al modello aggiornato: i marcatori del unsafe chiamato passano attraverso i metadati. Il chiamante esegue il wrapping di ogni chiamata a un membro non sicuro richiesto in un unsafe blocco.
  • Chiamante del modello aggiornato, chiamato originale: una modalità di compatibilità considera qualsiasi membro chiamato con un tipo di puntatore nella firma come richiesto-non sicuro, quindi il sito di chiamata necessita di un blocco di inclusione unsafe . Questa modalità impedisce a un'API basata su puntatore di perdere automaticamente il unsafe requisito.
  • Chiamante modello originale, chiamato modello aggiornato: le regole del puntatore originali sono ancora valide. Un membro non sicuro che non ha alcun tipo di puntatore nella firma diventa chiamabile dal codice sicuro, perché il chiamante del modello originale non riesce a leggere i nuovi marcatori.

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 C# #define non consente a un simbolo di avere un valore, come nei linguaggi come C++. Ad esempio, #define non è possibile creare una macro o definire una costante. Se è necessario definire una costante, usare una variabile enum. Se si vuole creare una macro in stile C++, prendere in considerazione alternative come 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#.

Avviso

Non impostare l'elemento LangVersion su latest. L'impostazione latest indica che il compilatore installato utilizza la versione più recente. Tale versione può cambiare da computer a computer, rendendo le compilazioni inaffidabili. Abilita inoltre le funzionalità del linguaggio che potrebbero richiedere funzionalità di runtime o libreria non incluse nell'SDK corrente.

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>

Alcune funzionalità di anteprima richiedono un consenso esplicito separato oltre a <LangVersion>preview</LangVersion>. Ad esempio, le regole di sicurezza della memoria aggiornate di C# 15 usano la funzionalità del updated-memory-safety-rules compilatore. Per altre informazioni, vedere Abilitare le regole di sicurezza della memoria aggiornate.

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

Considerazioni

  • Per assicurarsi che il progetto usi la versione del compilatore predefinita consigliata per il framework di destinazione, non usare l'opzione LangVersion. 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.

  • L'opzione del compilatore LangVersion non influisce sui metadati a cui fa riferimento l'applicazione C#.

  • 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 ha requisiti minimi .NET API o Common Language Runtime che potrebbero consentire l'esecuzione su framework di livello inferiore includendo 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

Usare l'opzione Nullable per specificare il contesto nullable. Impostarlo nella configurazione del progetto usando il <Nullable> tag :

<Nullable>enable</Nullable>

L'argomento deve essere enable, disable, warnings o annotations. L'argomento enable attiva il contesto nullable. L'argomento disable disattiva il contesto nullable. L'argomento warnings attiva il contesto di avviso nullable. L'argomento annotations attiva il contesto di annotazione nullable. Per altre informazioni su questi valori, vedere Contesti nullable. Per altre informazioni sull'abilitazione dei tipi riferimento nullable in una codebase esistente, vedere Strategie di migrazione nullable.

Nota

Se non si imposta un valore, il valore predefinito è disable. Tuttavia, .NET 6 e i modelli più recenti impostano il valore Nullable su enable per impostazione predefinita.

L'analisi del flusso deduce 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. Il compilatore analizza le chiamate al metodo anche quando la chiamata viene omessa in modo condizionale dall'output compilato. Ad esempio, il compilatore analizza ancora una chiamata a Debug.Assert per ottenere valori Null, anche se la chiamata è condizionale e non viene compilata in build di versione.

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

Importante

Il contesto nullable 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. Un file viene contrassegnato come generato in uno dei modi seguenti:

  1. In .editorconfig specificare generated_code = true in una sezione che si applica a tale file.
  2. Includere <auto-generated> o <auto-generated/> in un commento nella parte superiore del file. È possibile posizionarlo su qualsiasi riga nel 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 #nullable preprocessore.