C # 6.0 fonctionne-t-il pour .NET 4.0?

275

J'ai créé un exemple de projet, avec des goodies C # 6.0 - propagation nulle et initialisation des propriétés à titre d'exemple, définissez la version cible .NET 4.0 et cela ... fonctionne.

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);
    }
}

Cela signifie-t-il que je peux utiliser les fonctionnalités C # 6.0 pour mon logiciel qui cible .NET 4.0? Y a-t-il des limitations ou des inconvénients?

MajesticRa
la source
7
Les versions .Net 2.0 - 3.5 utilisent CLR v2.0. Les versions plus récentes utilisent CLR v4.0.
i3arnon
Gardez à l'esprit que, optimisez sage: vous ajoutez un test if-null-check séparé pour chaque chat comme celui-ci
Terence
2
Mon Dieu. J'ai développé un WCF ciblant la v4.6 juste pour être "rappelé" que le serveur de production ne doit pas être mis à niveau avant 2018. Je pensais qu'un travail d'un mois nécessiterait quelques jours de refactoring. Terminé en cinq minutes. Merci, Microsoft! : D
Eric Wu

Réponses:

286

Oui (surtout). C # 6.0 nécessite le nouveau compilateur Roslyn, mais le nouveau compilateur peut compiler en ciblant les anciennes versions du framework. Cela n'est limité qu'aux nouvelles fonctionnalités qui ne nécessitent pas de prise en charge par le cadre .

Par exemple, alors que vous pouvez utiliser la fonction d'interpolation de chaîne dans C # 6.0 avec les versions antérieures de .Net (car elle entraîne un appel à string.Format):

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

Vous avez besoin de .Net 4.6 pour l'utiliser IFormattablecar seule la nouvelle version du framework ajoute System.FormattableString:

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

Les cas que vous avez mentionnés n'ont pas besoin de types du framework pour fonctionner. Le compilateur est donc entièrement capable de prendre en charge ces fonctionnalités pour les anciennes versions du framework.

i3arnon
la source
31
En fait, vous n'avez pas besoin de .Net 4.6, juste quelques types qui y sont ajoutés. Vous pouvez les ajouter vous-même aux anciens frameworks. Ce code fonctionne bien sur .Net 4.0 et 3.5.
svick
10
Existe-t-il une liste quelque part pour voir quelles fonctionnalités C # 6 fonctionnent dans .NET 4.0? Une autre façon de le demander serait: quelles nouvelles fonctionnalités nécessitent le support du framework et lesquelles ne le font pas?
Rubenisme
1
@Rubenisme Je ne peux pas penser à un autre que l' IFormattableinterpolation de chaînes.
i3arnon
2
Je suppose que nous pouvons dire que tous les sucres syntaxiques peuvent être utilisés et ciblés sur des versions de framework plus anciennes. est-ce ok de dire ça?
mkb
4
@mkb oui. Le sucre syntaxique est exactement ces fonctionnalités qui ne dépendent que des capacités du compilateur et non de celles du framework.
i3arnon
52

Je veux juste me concentrer sur la façon de comprendre Wikipédia et d'autres liens.

Lorsque Wikipedia indique que C # 6.0 est avec .NET Framework 4.6, cela signifie simplement que la version de production du compilateur (msc.exe) fera partie de la version .NET Framework 4.6. Via le ciblage multiple , ces compilateurs peuvent prendre en charge les versions inférieures des versions de .NET Framework. Bien sûr, depuis que Roslyn est devenu un projet open source, le compilateur est maintenant complètement un composant individuel.

Lorsque quelque chose fait référence à la version CLR de 4.0.30319 (.0), il peut s'agir en fait de .NET Framework 4. * (4.0, 4.0. *, 4.5, 4.5. *, 4.6, 4.6. *), Car ils implémentent tous le Spécification CLR version 4. Sans oublier que Xamarin / Mono implémente également la même spécification CLR.

La page MSDN n'est pas encore entièrement mise à jour, mais certaines pages ont déjà .NET Framework 4.6 répertorié dans la section Informations sur la version.

Dans l'ensemble, les spécifications de langage (ainsi que le compilateur C #), les spécifications CLR et les versions de .NET Framework ne sont pas étroitement liées les unes aux autres. Il donne aux développeurs suffisamment de flexibilité pour utiliser de nouveaux compilateurs pour cibler les CLR et les cadres .NET plus anciens.

Lex Li
la source
29

Oui, vous pouvez utiliser des compilateurs plus récents pour les anciens frameworks et accéder aux nouvelles fonctionnalités du compilateur (tant que ces fonctionnalités ne nécessitent pas de nouveaux types introduits dans .NET 4.6).

D'autres exemples de cela sont des méthodes avec des paramètres par défaut qui ont été introduites avec C # 4.0 (.NET 4.0) mais vous pouvez les utiliser dans des projets .NET 2.0 (C # 2.0) et .NET 3.5 (C # 3.0).

Vous pouvez également utiliser des méthodes d'extension (introduites dans C # 3.0) dans .NET 2.0 ou .NET 3.0 si vous effectuez une petite solution de contournement pour rendre le compilateur heureux afin qu'il puisse trouver un attribut introduit dans .NET 3.5.

Scott Chamberlain
la source
1

Si vous utilisez des scripts de construction, n'oubliez pas de changer le chemin vers le nouveau générateur:

définissez CPATH = C: \ Program Files (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
oobe
la source
1

La réponse de @oobe est en fait importée. J'ai pu créer ma solution via un fichier de commandes uniquement après avoir utilisé MSBuild.exe à partir de C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin .

Suryakant Soni
la source