Cómo usar las nuevas características de c # 8.0 en las vistas de Razor

14

He actualizado mi aplicación web ASP.NET Mvc 5 para usar las nuevas funciones de c # 8.0 a través de Visual Studio 2019 y todo funciona bien hasta que trato de usar estas nuevas funciones dentro de una vista Razor.

Por ejemplo, si trato de usar la nueva expresión de cambio:

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

El compilador no se quejará hasta que trate de llegar a la página, dándome un error de compilación.

Error de compilación

Sospecho que Microsoft.CodeDom.Providers.DotNetCompilerPlatformdebe actualizarse, pero parece que no hay actualizaciones disponibles.

¿Hay alguna forma de usar las características del lenguaje c # 8.0 en las vistas de Razor?

dbraillon
fuente
bueno, ahí es exactamente donde descubrí que probablemente esté relacionado con el Microsoft.CodeDom.Providers.DotNetCompilerPlatformpaquete, pero de alguna manera no puedo hacer que funcione para c # 8.0
dbraillon
funciona para mí, - He actualizado la referencia a Microsoft.CodeDom.Providers.DotNetCompilerPlatform a la versión # 2.0.1 (Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Version 2.0.1)
Yob
Acabo de intentar otra vez con una nueva solución: crear una nueva solución con la plantilla mvc predeterminada con .Net Framework, escribir algún código de c # 8.0, visual studio preguntar si quiero actualizar mi proyecto para usar c # 8.0, aceptarlo y luego escribir eso mismo código para una vista. Lo hace de compilación, pero no se ejecutará en tiempo de ejecución ...
dbraillon
¿Alguna suerte en este tema?
eaglei22

Respuestas:

6

.net framework es compatible con C # 7.3 por eso no puede hacer que su Razor View funcione

.net core 3 es compatible con C # 8 y pude hacer que su ejemplo funcione con una aplicación .net Core 3 MVC.

Puede echar un vistazo aquí: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/configure-language-version

Espero que lo de arriba ayude :)

Ricky Stam
fuente
Si bien lo que estás diciendo es cierto. Yo soy capaz de utilizar C # 8.0 características en mi proyecto .NET 4.7.2 simplemente cambiando el LangVersionen mi csproj. Incluso puedo usar la función anulable. Y el código sugerido por el OP compila y funciona bien. Entonces, es interesante por qué esto no funcionaría para una aplicación ASP.NET.
Thomas Heijtink
@ThomasHeijtink, consulte la última actualización de Microsoft.CodeDom.Providers.DotNetCompilerPlatform hace un año: 13.09.2018. Entonces, ahora las características de C # 8 no son compatibles con el compilador incluido.
Hal
1
@ThomasHeijtink, podrías contribuir al repositorio . Creo que sólo tiene que utilizar la última versión de Microsoft.Net.Compilers en RoslynCodeProvider.settings.targets : <MSNetCompilersNuGetPackageLatestVersion>3.3.1</MSNetCompilersNuGetPackageLatestVersion>. Puede construir su propio paquete nuget a partir de fuentes y usarlo (o hacer relaciones públicas y obtener comentarios con la esperanza de fusionarlo en maestro).
Hal
¿Alguien ha intentado un tenedor? No veo uno en GitHub (que agrega este cambio). Mi objetivo es hacer una transición gradual de un proyecto ASP.NET Classic al núcleo, y tener algún código atascado en 7.x me duele.
Sören Kuklau
2

De acuerdo, hay algunas cosas que deben aclararse primero.

De acuerdo con esta respuesta , la versión del lenguaje C # está vinculada con el marco, y C # 8.0 está totalmente disponible para todos los idiomas que admitan .Net Standard 2.1. .NET Framework 4.7.2 y versiones posteriores no son compatibles con .NET Standard 2.1 y no será el caso en el futuro.

Mientras tanto, hay una manera de usar C # 8.0 si especifica LangVersion en cualquier archivo de proyecto .csproj:

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

Esto habilitará C # 8.0 y algunas características del marco no vinculadas estarán disponibles para usted. Verifique la respuesta del enlace para saber cuál.

Finalmente para responder mi propia pregunta, en este momento, no, no hay forma de usar ninguna de las características de C # 8.0 dentro de una vista Razor. La compilación en tiempo de ejecución parece hacerse con un paquete denominado, Microsoft.CodeDom.Providers.DotNetCompilerPlatformpor lo que la única forma sería actualizar ese paquete para permitir que se utilicen algunas de las nuevas funciones.

Actualizaré esa respuesta tan pronto como obtenga más información.

dbraillon
fuente