Jak korzystać z nowych funkcji c # 8.0 w widokach Razor

14

Zaktualizowałem moją aplikację internetową ASP.NET Mvc 5, aby korzystała z nowych funkcji c # 8.0 w Visual Studio 2019 i wszystko działa dobrze, dopóki nie spróbuję użyć tych nowych funkcji w widoku Razor.

Na przykład, jeśli spróbuję użyć nowego wyrażenia przełącznika:

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

Kompilator nie narzeka, dopóki nie spróbuję dotrzeć do strony, co spowoduje błąd kompilacji.

Błąd kompilacji

Podejrzewam, że Microsoft.CodeDom.Providers.DotNetCompilerPlatformnależy to zaktualizować, ale wygląda na to, że aktualizacja nie jest dostępna.

Czy istnieje sposób użycia funkcji języka c # 8.0 w widokach Razor?

dbraillon
źródło
cóż, właśnie tam znalazłem, że prawdopodobnie jest on związany z Microsoft.CodeDom.Providers.DotNetCompilerPlatformpakietem, ale nie mogę w jakiś sposób sprawić, by działał w wersji c # 8.0
dbraillon
działa dla mnie, - zaktualizowałem odwołanie do Microsoft.CodeDom.Providers.DotNetCompilerPlatform do wersji # 2.0.1 (Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Version 2.0.1)
yob
Właśnie próbowałem innym razem z nowym rozwiązaniem: stwórz nowe rozwiązanie z domyślnym szablonem mvc z .Net Framework, napisz kod c # 8.0, Visual Studio zapyta, czy chcę zaktualizować mój projekt do używania c # 8.0, zaakceptuj go, a następnie napisz to bardzo ten sam kod do widoku.
Kompiluje się,
Masz szczęście w tej sprawie?
eaglei22,

Odpowiedzi:

6

.NET Framework obsługuje C # 7.3, dlatego nie możesz sprawić, aby Twój Razor View działał

.net core 3 obsługuje C # 8 i udało mi się sprawić, by Twój przykład działał z aplikacją .net Core 3 MVC.

Możesz zajrzeć tutaj: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/configure-language-version

Mam nadzieję, że powyższe pomaga :)

Ricky Stam
źródło
Podczas gdy to, co mówisz, jest prawdą. Ja jestem w stanie używać C # 8.0 funkcje w moim projekcie .net 4.7.2 poprzez zmianę LangVersionw moim csproj. Mogę nawet użyć opcji zerowania. A sugerowany kod OP kompiluje się i działa dobrze. Ciekawe, dlaczego to nie zadziała dla aplikacji ASP.NET.
Thomas Heijtink,
@ThomasHeijtink, zobacz ostatnią aktualizację dla Microsoft.CodeDom.Providers.DotNetCompilerPlatform był rok temu - 13.09.2018. Tak więc teraz funkcje C # 8 nie są obsługiwane w pakiecie kompilatora.
hal
1
@ThomasHeijtink, możesz przyczynić się do repozytorium . Wierzę, że po prostu trzeba wykorzystać ostatnią wersję Microsoft.Net.Compilers w RoslynCodeProvider.settings.targets : <MSNetCompilersNuGetPackageLatestVersion>3.3.1</MSNetCompilersNuGetPackageLatestVersion>. Możesz zbudować swój własny pakiet nuget ze źródeł i go użyć (lub zrobić PR i uzyskać opinie z nadzieją na połączenie go w master).
hal
Czy ktoś próbował widelca? Nie widzę żadnego na GitHub (który dodaje tę zmianę). Moim celem jest stopniowe przenoszenie projektu ASP.NET Classic do rdzenia, a blokowanie kodu w wersji 7.x boli to.
Sören Kuklau
2

OK, więc są pewne rzeczy, które należy najpierw wyjaśnić.

Zgodnie z tą odpowiedzią wersja językowa C # jest powiązana z frameworkiem, a wersja C # 8.0 jest w pełni dostępna dla wszystkich języków, które obsługują .Net Standard 2.1. .NET Framework 4.7.2 i nowsze wersje nie obsługują .NET Standard 2.1 i nie będzie tak w przyszłości.

W międzyczasie istnieje sposób użycia C # 8.0, jeśli określisz LangVersion w dowolnym pliku projektu .csproj:

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

Umożliwi to C # 8.0, a niektóre funkcje niezwiązanego frameworka będą dostępne dla Ciebie. Sprawdź odpowiedź na link, aby dowiedzieć się, który z nich.

Wreszcie, aby odpowiedzieć na moje własne pytanie, w tej chwili nie, nie ma możliwości użycia żadnej z funkcji C # 8.0 w widoku Razor. Wydaje się, że kompilacja w czasie wykonywania jest wykonywana przy użyciu pakietu o nazwie, Microsoft.CodeDom.Providers.DotNetCompilerPlatformwięc jedynym sposobem jest aktualizacja tego pakietu, aby umożliwić korzystanie z niektórych nowych funkcji.

Zaktualizuję tę odpowiedź, jak tylko uzyskam więcej informacji.

dbraillon
źródło