C # 6.0 funziona per .NET 4.0?


275

Ho creato un progetto di esempio, con goodies di C # 6.0 - propagazione nulla e inizializzazione delle proprietà come esempio, impostare la versione di destinazione .NET 4.0 e ... funziona.

public class Cat
{
    public int TailLength { get; set; } = 4;

    public Cat Friend { get; set; }

    public string Mew() { return "Mew!"; }
}

class Program
{
    static void Main(string[] args)
    {
        var cat = new Cat {Friend = new Cat()};
        Console.WriteLine(cat?.Friend.Mew());
        Console.WriteLine(cat?.Friend?.Friend?.Mew() ?? "Null");
        Console.WriteLine(cat?.Friend?.Friend?.TailLength ?? 0);
    }
}

Significa che posso usare le funzionalità di C # 6.0 per il mio software destinato a .NET 4.0? Ci sono limitazioni o svantaggi?


7
Le versioni .Net 2.0 - 3.5 utilizzano CLR v2.0. Le versioni più recenti utilizzano CLR v4.0.
i3arnon,

tieni presente che, ottimizza in modo saggio: stai aggiungendo un controllo if-null separato per ogni gatto come questo
Terence,

2
Mamma mia. Ho sviluppato un WCF destinato alla v4.6 solo per essere "ricordato" che il server di produzione non deve essere aggiornato fino al 2018. Ho pensato che un mese di lavoro avrebbe richiesto alcuni giorni di refactoring. Terminato in cinque minuti. Grazie, Microsoft! : D
Eric Wu,

Risposte:


286

Sì (principalmente). C # 6.0 richiede il nuovo compilatore Roslyn, ma il nuovo compilatore può compilare come target versioni precedenti del framework. Questo è limitato solo alle nuove funzionalità che non richiedono supporto dal framework .

Ad esempio, mentre puoi usare la funzione di interpolazione di stringhe in C # 6.0 con versioni precedenti di .Net (in quanto risulta in una chiamata a string.Format):

int i = 3;
string s = $"{i}";

È necessario .Net 4.6 per utilizzarlo IFormattablepoiché solo la nuova versione del framework aggiunge System.FormattableString:

int i = 3;
IFormattable s = $"{i}";

I casi che hai citato non hanno bisogno di tipi dal framework per funzionare. Quindi il compilatore è pienamente in grado di supportare queste funzionalità per le vecchie versioni di framework.


31
In realtà, non è necessario .Net 4.6, solo alcuni tipi che vengono aggiunti in esso. Puoi aggiungerli ai framework più vecchi da solo. Questo codice funziona bene su .Net 4.0 e 3.5.
svick

10
C'è un elenco da qualche parte per vedere quali funzionalità di C # 6 funzionano in .NET 4.0? Un altro modo di chiederlo sarebbe: quali nuove funzionalità richiedono il supporto dal framework e quali no?
Rubenisme,

1
@Rubenisme Non riesco a pensare a un altro oltre IFormattableall'interpolazione di stringhe.
i3arnon,

2
Suppongo che possiamo dire che tutti gli zuccheri sintattici possono essere utilizzati e indirizzati a versioni di framework precedenti. va bene dirlo?
MK

4
@mkb sì. Lo zucchero sintattico è esattamente quelle caratteristiche che si basano solo sulle capacità del compilatore e non su quelle del framework.
i3arnon,

52

Voglio solo concentrarmi su come capire Wikipedia e altri collegamenti.

Quando Wikipedia dice che C # 6.0 è con .NET Framework 4.6, significa semplicemente che la versione di produzione del compilatore (msc.exe) farà parte della versione di .NET Framework 4.6. Tramite il multi-targeting , tali compilatori possono supportare versioni inferiori delle versioni di .NET Framework. Naturalmente, da quando Roslyn è diventato un progetto open source, il compilatore è ora completamente un singolo componente.

Quando qualcosa fa riferimento alla versione CLR di 4.0.30319 (.0), in realtà può essere .NET Framework 4. * (4.0, 4.0. *, 4.5, 4.5. *, 4.6, 4.6. *), Poiché implementano tutti Specifiche della versione 4 di CLR. Per non parlare di Xamarin / Mono implementano anche le stesse specifiche CLR.

La pagina MSDN non è ancora completamente aggiornata, ma alcune pagine hanno già .NET Framework 4.6 elencato nella sezione Informazioni sulla versione.

In tutto, le specifiche del linguaggio (così come il compilatore C #), le specifiche CLR e le versioni di .NET Framework non sono strettamente accoppiate tra loro. Offre agli sviluppatori una flessibilità sufficiente per utilizzare i nuovi compilatori per indirizzare CLR e .NET Framework più vecchi.


29

Sì, è possibile utilizzare compilatori più recenti per framework meno recenti e ottenere l'accesso alle nuove funzionalità del compilatore (purché tali funzionalità non richiedano nuovi tipi introdotti in .NET 4.6).

Altri esempi di questo sono metodi con parametri predefiniti introdotti con C # 4.0 (.NET 4.0) ma è possibile utilizzarli nei progetti .NET 2.0 (C # 2.0) e .NET 3.5 (C # 3.0).

Puoi anche usare i metodi di estensione (introdotti in C # 3.0) in .NET 2.0 o .NET 3.0 se esegui una piccola soluzione per rendere felice il compilatore in modo che possa trovare un attributo introdotto in .NET 3.5.


1

Se stai usando gli script di costruzione, ricorda di cambiare il percorso al nuovo builder:

set CPATH = C: \ Programmi (x86) \ MSBuild \ 14.0 \ Bin

[Rebuild.bat]

set CPATH=C:\Program Files (x86)\MSBuild\14.0\Bin
call nuget_restore.bat
"%CPATH%\msbuild" YourSolution.sln /t:Rebuild /p:Configuration=Release /fileLogger /flp:logfile=JustErrors.log;errorsonly /verbosity:minimal

if %errorlevel% neq 0 goto ERROR

REM call deploy Release  //Things like deploy files..
goto END

:ERROR
       echo ERROR: %errorlevel%
       pause

:END

1

La risposta di @oobe è in realtà importante. Ho potuto costruire la mia soluzione tramite un file batch solo dopo aver utilizzato MSBuild.exe da C: \ Programmi (x86) \ MSBuild \ 14.0 \ Bin .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.