Come utilizzare le nuove funzionalità di c # 8.0 nelle viste Razor


14

Ho aggiornato la mia applicazione Web ASP.NET Mvc 5 per utilizzare le nuove funzionalità di c # 8.0 tramite Visual Studio 2019 e tutto funziona perfettamente fino a quando non provo a utilizzare queste nuove funzionalità all'interno di una vista Razor.

Ad esempio, se provo a utilizzare la nuova espressione switch:

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

Il compilatore non si lamenterà finché non provo a raggiungere la pagina, dandomi un errore di compilazione.

Errore di compilazione

Sospetto che Microsoft.CodeDom.Providers.DotNetCompilerPlatformdebba essere aggiornato, ma sembra che non ci siano aggiornamenti disponibili.

Esiste un modo per utilizzare le funzionalità del linguaggio c # 8.0 nelle viste Razor?



bene, è esattamente qui che ho scoperto che è probabilmente correlato al Microsoft.CodeDom.Providers.DotNetCompilerPlatformpacchetto ma non riesco a farlo funzionare per c # 8.0 in qualche modo
dbraillon

funziona per me, - Ho aggiornato il riferimento a Microsoft.CodeDom.Providers.DotNetCompilerPlatform alla versione # 2.0.1 (pacchetto di installazione Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Version 2.0.1)
anno

Ho appena provato un'altra volta con una nuova soluzione: creare una nuova soluzione con un modello mvc predefinito con .Net Framework, scrivere del codice c # 8.0, visual studio chiedermi se voglio aggiornare il mio progetto per usare c # 8.0, accettarlo e scrivere così stesso codice per una vista. Si compila ma non verrà eseguito in fase di esecuzione ...
dbraillon

Qualche fortuna su questo problema?
eaglei22,

Risposte:


6

.net framework supporta C # 7.3 per questo motivo non è possibile far funzionare Razor View

.net core 3 supporta C # 8 e sono stato in grado di far funzionare il tuo esempio con un'app .net Core 3 MVC.

Puoi dare un'occhiata qui: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/configure-language-version

Spero che quanto sopra aiuti :)


Mentre quello che stai dicendo è vero. Io sono in grado di utilizzare C # 8.0 caratteristiche nel mio progetto NET 4.7.2 semplicemente cambiando il LangVersionmio csproj. Posso persino usare la funzione nullable. E il codice suggerito dall'OP si compila e funziona bene. Quindi è interessante il motivo per cui questo non funzionerebbe per un'applicazione ASP.NET.
Thomas Heijtink,

@ThomasHeijtink, vedi l'ultimo aggiornamento per Microsoft.CodeDom.Providers.DotNetCompilerPlatform è stato un anno fa - 13.09.2018. Quindi, ora le funzionalità di C # 8 non sono supportate con il compilatore in bundle.
metà

1
@ThomasHeijtink, potresti contribuire al repository . Credo non vi resta che utilizzare ultima versione di Microsoft.Net.Compilers in RoslynCodeProvider.settings.targets : <MSNetCompilersNuGetPackageLatestVersion>3.3.1</MSNetCompilersNuGetPackageLatestVersion>. Potresti costruire il tuo pacchetto nuget da fonti e usarlo (o fare PR e ottenere feedback con la speranza di unirlo al master).
metà

Qualcuno ha tentato una forchetta? Non ne vedo uno su GitHub (che aggiunge questa modifica). Il mio obiettivo è di trasferire gradualmente un progetto ASP.NET Classic al core e avere del codice bloccato su 7.x fa male.
Sören Kuklau,

2

OK, ci sono alcune cose che devono essere chiarite per prime.

Secondo questa risposta , la versione in linguaggio C # è legata al framework e C # 8.0 è completamente disponibile per tutte le lingue che supportano .Net Standard 2.1. .NET Framework 4.7.2 e versioni successive non supportano .NET Standard 2.1 e in futuro non lo saranno.

Nel frattempo c'è un modo per usare C # 8.0 se specifichi LangVersion in qualsiasi file di progetto .csproj:

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

Ciò abiliterà C # 8.0 e saranno disponibili alcune funzionalità di framework non legate. Controlla la risposta del link per sapere quale.

Finalmente per rispondere alla mia domanda, in questo momento no, non c'è modo di usare nessuna delle funzionalità di C # 8.0 all'interno di una vista Razor. La compilazione di runtime sembra essere eseguita con un pacchetto denominato, Microsoft.CodeDom.Providers.DotNetCompilerPlatformquindi l'unico modo sarebbe quello di aggiornare quel pacchetto per consentire l'utilizzo di alcune delle nuove funzionalità.

Aggiornerò quella risposta non appena avrò maggiori informazioni.

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.