Comment utiliser les nouvelles fonctionnalités c # 8.0 dans les vues Razor

14

J'ai mis à jour mon application Web ASP.NET Mvc 5 pour utiliser les nouvelles fonctionnalités c # 8.0 via Visual Studio 2019 et tout fonctionne correctement jusqu'à ce que j'essaie d'utiliser ces nouvelles fonctionnalités dans une vue Razor.

Par exemple, si j'essaie d'utiliser la nouvelle expression de commutateur:

@{
    ViewBag.Title = "About";

    var foo = 1;
    var bar = foo switch
    {
        1 => "one",
        2 => "two",
        _ => string.Empty
    };
}
<h2>@ViewBag.Title.</h2>
<h3>@ViewBag.Message</h3>

<p>Use this area to provide additional information.</p>

Le compilateur ne se plaindra pas jusqu'à ce que j'essaie d'atteindre la page, ce qui me donne une erreur de compilation.

Erreur de compilation

Je soupçonne que cela Microsoft.CodeDom.Providers.DotNetCompilerPlatformdoit être mis à jour mais il semble qu'il n'y ait pas de mise à jour disponible.

Existe-t-il un moyen d'utiliser les fonctionnalités du langage c # 8.0 dans les vues Razor?

dbraillon
la source
cela va-t-il aider? - stackoverflow.com/questions/31689374/…
yob
eh bien, c'est exactement là que j'ai trouvé qu'il était probablement lié au Microsoft.CodeDom.Providers.DotNetCompilerPlatformpaquet mais je ne peux pas le faire fonctionner pour c # 8.0 d'une manière ou d'une autre
dbraillon
fonctionne pour moi, - J'ai mis à jour la référence à Microsoft.CodeDom.Providers.DotNetCompilerPlatform vers la version # 2.0.1 (Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Version 2.0.1)
yob
Je viens d'essayer une autre fois avec une nouvelle solution: créer une nouvelle solution avec le modèle mvc par défaut avec .Net Framework, écrire du code c # 8.0, Visual Studio me demander si je veux mettre à jour mon projet pour utiliser c # 8.0, l'accepter puis l'écrire très même code pour une vue. Il compile mais ne s'exécutera pas au moment de l'exécution ...
dbraillon
Une chance sur cette question?
eaglei22

Réponses:

6

Le framework .net prend en charge C # 7.3 c'est pourquoi vous ne pouvez pas faire fonctionner votre vue Razor

.net core 3 prend en charge C # 8 et j'ai pu faire fonctionner votre exemple avec une application .net Core 3 MVC.

Vous pouvez jeter un œil ici: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/configure-language-version

J'espère que ce qui précède aide :)

Ricky Stam
la source
Alors que ce que vous dites est vrai. Je peux utiliser les fonctionnalités C # 8.0 dans mon projet .net 4.7.2 en changeant simplement le LangVersiondans mon csproj. Je peux même utiliser la fonction nullable. Et le code suggéré par l'OP se compile et fonctionne très bien. Il est donc intéressant de savoir pourquoi cela ne fonctionnerait pas pour une application ASP.NET.
Thomas Heijtink
@ThomasHeijtink, voir la dernière mise à jour pour Microsoft.CodeDom.Providers.DotNetCompilerPlatform était il y a un an - 13.09.2018. Ainsi, les fonctionnalités C # 8 ne sont désormais plus prises en charge avec le compilateur fourni.
hal
1
@ThomasHeijtink, vous pouvez contribuer au référentiel . Je crois que vous avez juste besoin d'utiliser la dernière version de Microsoft.Net.Compilers en RoslynCodeProvider.settings.targets : <MSNetCompilersNuGetPackageLatestVersion>3.3.1</MSNetCompilersNuGetPackageLatestVersion>. Vous pouvez créer votre propre paquet de pépites à partir de sources et l'utiliser (ou faire des relations publiques et obtenir des commentaires dans l'espoir de le fusionner en maître).
hal
Quelqu'un a-t-il essayé une fourchette? Je n'en vois pas sur GitHub (qui ajoute ce changement). Mon objectif est de faire progressivement la transition d'un projet ASP.NET Classic vers le noyau, et avoir du code bloqué sur 7.x blesse cela.
Sören Kuklau
2

OK donc, il y a des choses qui doivent être clarifiées en premier.

Selon cette réponse , la version du langage C # est liée au framework et C # 8.0 est entièrement disponible pour tous les langages qui prennent en charge la norme .Net 2.1. .NET Framework 4.7.2 et inférieur ne prend pas en charge .NET Standard 2.1 et ce ne sera plus le cas à l'avenir.

En attendant, il existe un moyen d'utiliser C # 8.0 si vous spécifiez la LangVersion dans n'importe quel fichier de projet .csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net48</TargetFrameworks>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>

Cela activera C # 8.0 et certaines fonctionnalités du framework non liées seront à votre disposition. Vérifiez la réponse du lien pour savoir laquelle.

Enfin, pour répondre à ma propre question, pour le moment, non, il n'y a aucun moyen d'utiliser l'une des fonctionnalités C # 8.0 dans une vue Razor. La compilation au moment de l'exécution semble être effectuée avec un package nommé, Microsoft.CodeDom.Providers.DotNetCompilerPlatformdonc la seule façon serait de mettre à jour ce package pour permettre l'utilisation de certaines des nouvelles fonctionnalités.

Je mettrai à jour cette réponse dès que j'obtiendrai plus d'informations.

dbraillon
la source