2015-07-22 17 views
9

Possiedo un progetto destinato a versioni precedenti di .NET framework (.NET 4.5.2). Ho installato Visual Studio 2015 (e quindi .NET 4.6 sulla mia macchina). Ho notato che se utilizzo le funzionalità del linguaggio C# rilasciate in .NET 4.6/C# 6, vengono comunque compilate. Se il framework di destinazione del mio progetto è < NET 4.6, non deve questo non compilare:Perché il codice specifico di .NET 4.6 viene compilato quando si targetizzano versioni precedenti del framework?

public string MyExpressionBodyProperty => "1"; 

    //auto properties are new in C# 6 
    public string MyAutoProperty { get; } = "1"; 

    private static void MethodThatUsesNameOf(string filename) 
    { 
     if (filename == null) 
     { 
      //nameof was released in C# 6 
      throw new ArgumentException("The file does not exist.", nameof(filename)); 
     } 
    } 

Come posso assicurarmi che sto utilizzando solo funzionalità del linguaggio .NET che funzionano con la versione quadro ho scelto come target?

risposta

20

La versione di .NET Framework e la versione in linguaggio C# sono cose diverse. Le funzionalità del linguaggio C# 6

public string MyAutoProperty { get; } = "1"; 
nameof(filename) 

possono essere compilate da VS 2015 in un codice destinato a framework precedenti.

In che modo posso garantire che sto utilizzando solo le funzionalità del linguaggio .NET che funzionano con la versione di framework a cui sono destinato?

Se si tenta di utilizzare una funzionalità di .NET 4.6 Framework, si otterrà un errore del compilatore appropriato se si mira a un framework precedente.

Sarei in grado di distribuire questo codice su computer che non ha .NET 4.6?

Sì, lo faresti. Finché la macchina di distribuzione ha una struttura compatibile con quella scelta come target in VS2015.

+2

Un'altra opzione è quella di passare a C# versione 5 in Proprietà progetto - Build - Avanzate. –

12

Ci sono funzioni C# 6 e funzioni .NET 4.6.

nameofnameof è una funzionalità C# 6, quindi deve essere in esecuzione solo su un compilatore più recente, ma può comunque utilizzare il vecchio framework .NET.

Un esempio di una funzione che richiede .NET 4.6 è la seguente:

public void Foo(IReadOnlyCollection<string> input) 
{ 
} 

public void Main(string[] args) 
{ 
    Foo(new Stack<string>()); 
} 

In .NET 4.6 Stack implementa IReadOnlyCollection ma nelle versioni precedenti non è così. Il codice precedente non riuscirà a compilare se hai selezionato .NET 4.5.2 come piattaforma di destinazione.

+0

Sarei in grado di distribuire questo codice su computer che non ha .NET 4.6? Non seguo l'ultima frase "In genere le classi sono coinvolte quando si parla di funzionalità di .NET framework." –

+1

Sì, lo faresti. Finché la macchina di distribuzione ha una struttura compatibile con quella scelta come target in VS2015. –

+1

@whatevAR: ho espanso il mio commento per un esempio specifico di funzionalità. [Ecco un elenco di modifiche] (https://msdn.microsoft.com/en-us/library/ms171868 (v = vs.110) .aspx) specifiche per la nuova versione di .NET framework per altri esempi . Se non è su quella pagina non è qualcosa che devi preoccuparti di utilizzare. Anche il compilatore può essere considerato attendibile per determinare se una funzione può essere utilizzata o meno. – Guvante

Problemi correlati