web-dev-qa-db-fra.com

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

J'ai créé un exemple de projet, avec les goodies C # 6.0 - la propagation nulle et l'initialisation des propriétés, par exemple, définir la version cible .NET 4.0 et tout ... 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);
    }
}

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

268
MajesticRa

Oui (principalement) C # 6.0 nécessite le nouveau compilateur Roslyn, mais le nouveau compilateur peut compiler en ciblant les anciennes versions du framework. Cela ne concerne que les nouvelles fonctionnalités qui ne nécessitent pas de support du framework.

Par exemple, vous pouvez utiliser la fonction d'interpolation de chaînes dans C # 6.0 avec des versions antérieures de .Net (car il en résulte un appel à string.Format):

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

Vous avez besoin de .Net 4.6 pour l’utiliser avec IFormattable, car 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 cadre pour fonctionner. Ainsi, le compilateur est entièrement capable de prendre en charge ces fonctionnalités pour les anciennes versions du framework.

279
i3arnon

Je veux juste me concentrer sur la façon de comprendre Wikipedia et d’autres liens.

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

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

La page MSDN n'est pas encore complètement mise à jour, mais ne page .NET Framework 4.6 est déjà répertorié dans la section Informations sur la version.

En tout, les spécifications de langage (ainsi que le compilateur C #), les spécifications de CLR et les versions de .NET Framework ne sont pas étroitement couplées. Il offre aux développeurs suffisamment de flexibilité pour utiliser de nouveaux compilateurs afin de cibler les anciens CLR et les frameworks .NET.

51
Lex Li

Oui, vous pouvez utiliser des compilateurs plus récents pour des frameworks plus anciens 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).

Les méthodes avec les paramètres par défaut ont également été introduites avec C # 4.0 (.NET 4.0), mais vous pouvez les utiliser dans les 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 solution de contournement pour rendre le compilateur heureux afin qu'il puisse trouver un attribut qui a été introduit dans .NET 3.5.

28

Answer by @oobe est important. Je pouvais construire ma solution via un fichier de commandes uniquement après avoir utilisé le MSBuild.exe à partir de C:\Program Files (x86)\MSBuild\14.0\Bin.

1
Suryakant Soni

Si vous utilisez des scripts de construction, n'oubliez pas de changer le chemin du nouveau constructeur:

définir CPATH = C:\Fichiers de programme (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
oobe