So verwenden Sie neue c # 8.0-Funktionen in Razor-Ansichten

14

Ich habe meine ASP.NET Mvc 5-Webanwendung aktualisiert, um die neuen c # 8.0-Funktionen über Visual Studio 2019 zu verwenden, und alles funktioniert einwandfrei, bis ich versuche, diese neuen Funktionen in einer Razor-Ansicht zu verwenden.

Wenn ich zum Beispiel versuche, den neuen Schalterausdruck zu verwenden:

@{
    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>

Der Compiler wird sich nicht beschweren, bis ich versuche, die Seite zu erreichen, was mir einen Kompilierungsfehler gibt.

Kompilierungsfehler

Ich vermute, dass Microsoft.CodeDom.Providers.DotNetCompilerPlatformdas aktualisiert werden muss, aber es scheint, dass kein Update verfügbar ist.

Gibt es eine Möglichkeit, c # 8.0-Sprachfunktionen in Razor-Ansichten zu verwenden?

Dbraillon
quelle
Microsoft.CodeDom.Providers.DotNetCompilerPlatform
Nun
funktioniert für mich, - Ich habe den Verweis auf Microsoft.CodeDom.Providers.DotNetCompilerPlatform auf Version 2.0.1 (Installationspaket Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Version 2.0.1)
aktualisiert
Ich habe es gerade ein anderes Mal mit einer neuen Lösung versucht: Erstellen Sie eine neue Lösung mit der Standard-MVC-Vorlage mit .Net Framework, schreiben Sie einen C # 8.0-Code, Visual Studio fragt, ob ich mein Projekt aktualisieren möchte, um C # 8.0 zu verwenden, akzeptieren Sie es und schreiben Sie es dann genau gleicher Code zu einer Ansicht. Es wird zwar kompiliert, aber zur Laufzeit nicht ausgeführt ...
dbraillon
Haben Sie Glück in dieser Angelegenheit?
eaglei22

Antworten:

6

Das .net Framework unterstützt C # 7.3, weshalb Sie Ihre Razor View nicht zum Laufen bringen können

.net Core 3 unterstützt C # 8 und ich konnte Ihr Beispiel mit einer .net Core 3 MVC-App zum Laufen bringen.

Sie können hier einen Blick darauf werfen: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/configure-language-version

Ich hoffe das obige hilft :)

Ricky Stam
quelle
Während das, was du sagst, wahr ist. Ich bin der Lage , durch die C # 8.0 - Features in meinem .net 4.7.2 Projekt verwenden einfache Änderung LangVersionin meinem csproj. Ich kann sogar die nullbare Funktion verwenden. Und der vom OP vorgeschlagene Code wird kompiliert und läuft einwandfrei. Es ist also interessant, warum dies für eine ASP.NET-Anwendung nicht funktioniert.
Thomas Heijtink
@ThomasHeijtink, siehe letztes Update für Microsoft.CodeDom.Providers.DotNetCompilerPlatform war vor einem Jahr - 13.09.2018. Daher werden C # 8-Funktionen mit dem gebündelten Compiler nicht unterstützt.
hal
1
@ThomasHeijtink, Sie könnten zum Repository beitragen . Ich glaube, Sie müssen nur die letzte Version von Microsoft.Net.Compilers in RoslynCodeProvider.settings.targets verwenden : <MSNetCompilersNuGetPackageLatestVersion>3.3.1</MSNetCompilersNuGetPackageLatestVersion>. Sie können Ihr eigenes Nuget-Paket aus Quellen erstellen und verwenden (oder PR erstellen und Feedback erhalten, in der Hoffnung, es in Master zusammenzuführen).
hal
Hat jemand eine Gabelung versucht? Ich sehe keine auf GitHub (das fügt diese Änderung hinzu). Mein Ziel ist es, ein ASP.NET Classic-Projekt schrittweise auf den Kern umzustellen, und es tut weh, wenn Code auf 7.x steckt.
Sören Kuklau
2

OK, es gibt einige Dinge, die zuerst geklärt werden müssen.

Entsprechend dieser Antwort ist die C # -Sprachenversion an das Framework gebunden, und C # 8.0 ist für alle Sprachen, die .Net Standard 2.1 unterstützen, vollständig verfügbar. .NET Framework 4.7.2 und niedriger unterstützt .NET Standard 2.1 nicht und wird in Zukunft nicht mehr der Fall sein.

In der Zwischenzeit gibt es eine Möglichkeit, C # 8.0 zu verwenden, wenn Sie die LangVersion in einer .csproj-Projektdatei angeben:

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

Dadurch wird C # 8.0 aktiviert und einige nicht gebundene Framework-Funktionen stehen Ihnen zur Verfügung. Überprüfen Sie die Linkantwort, um zu wissen, welche.

Um meine eigene Frage zu beantworten: Nein, es gibt derzeit keine Möglichkeit, eine der C # 8.0-Funktionen in einer Razor-Ansicht zu verwenden. Die Laufzeitkompilierung scheint mit einem Paket namens durchgeführt zu Microsoft.CodeDom.Providers.DotNetCompilerPlatformwerden. Die einzige Möglichkeit wäre, dieses Paket zu aktualisieren, damit einige der neuen Funktionen verwendet werden können.

Ich werde diese Antwort aktualisieren, sobald ich weitere Informationen erhalte.

Dbraillon
quelle