Como usar os novos recursos do c # 8.0 nas visualizações do Razor


14

Atualizei meu aplicativo Web ASP.NET Mvc 5 para usar os novos recursos do c # 8.0 através do Visual Studio 2019 e tudo funciona bem até que eu tente usar esses novos recursos dentro de uma exibição do Razor.

Por exemplo, se eu tentar usar a nova expressão de opção:

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

O compilador não irá reclamar até eu tentar acessar a página, causando um erro de compilação.

Erro de compilação

Eu suspeito que Microsoft.CodeDom.Providers.DotNetCompilerPlatformdeve ser atualizado, mas parece que não há nenhuma atualização disponível.

Existe alguma maneira de usar os recursos da linguagem c # 8.0 nas visualizações do Razor?



Bem, isso é exatamente onde eu achei que ele está provavelmente relacionado ao Microsoft.CodeDom.Providers.DotNetCompilerPlatformpacote, mas eu não posso fazê-lo funcionar para c # 8.0 de alguma forma
dbraillon

funciona para mim - atualizei a referência para Microsoft.CodeDom.Providers.DotNetCompilerPlatform para a versão 2.0.1 (Pacote de instalação Microsoft.CodeDom.Providers.DotNetCompilerPlatform - versão 2.0.1)
yob

Eu apenas tentei outra vez com uma nova solução: crie uma nova solução com o modelo mvc padrão com o .Net Framework, escreva um código c # 8.0, o visual studio pergunte se eu quero atualizar meu projeto para usar o c # 8.0, aceite-o e escreva muito mesmo código para uma visualização. Ele faz de compilação, mas não será executado em tempo de execução ...
dbraillon

Alguma sorte neste assunto?
eaglei22

Respostas:


6

A estrutura .net suporta C # 7.3 e é por isso que você não pode fazer seu Razor View funcionar

O .net core 3 suporta C # 8 e pude fazer seu exemplo funcionar com um aplicativo .net Core 3 MVC.

Você pode dar uma olhada aqui: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/configure-language-version

Espero que o acima ajude :)


Enquanto o que você está dizendo é verdade. Eu posso usar os recursos do C # 8.0 no meu projeto .net 4.7.2 simplesmente alterando o LangVersionno meu csproj. Eu posso até usar o recurso anulável. E o código sugerido pelo OP compila e roda muito bem. Portanto, é interessante por que isso não funcionaria para um aplicativo ASP.NET.
Thomas Heijtink 17/11/19

@ThomasHeijtink, veja a última atualização de Microsoft.CodeDom.Providers.DotNetCompilerPlatform foi um ano atrás - 13.09.2018. Portanto, agora os recursos do C # 8 não são suportados pelo compilador incluído.
hal

11
@ThomasHeijtink, você pode contribuir para o repositório . Eu acredito que você só precisa usar última versão do Microsoft.Net.Compilers em RoslynCodeProvider.settings.targets : <MSNetCompilersNuGetPackageLatestVersion>3.3.1</MSNetCompilersNuGetPackageLatestVersion>. Você pode criar seu próprio pacote de nuget a partir das fontes e usá-lo (ou fazer PR e obter feedback com a esperança de mesclá-lo no master).
hal

Alguém já tentou um garfo? Não vejo um no GitHub (que adiciona essa alteração). Meu objetivo é fazer a transição gradual de um projeto do ASP.NET Classic para o núcleo, e ter algum código preso no 7.x meio que prejudica isso.
Sören Kuklau 16/04

2

OK, há algumas coisas que precisam ser esclarecidas primeiro.

De acordo com esta resposta , a versão da linguagem C # está vinculada à estrutura e a C # 8.0 está totalmente disponível para todos os idiomas que suportam o .Net Standard 2.1. O .NET Framework 4.7.2 e abaixo não oferece suporte ao .NET Standard 2.1 e não será o caso no futuro.

Enquanto isso, há uma maneira de usar o C # 8.0 se você especificar o LangVersion em qualquer arquivo de projeto .csproj:

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

Isso habilitará o C # 8.0 e alguns recursos da estrutura não vinculada estarão disponíveis para você. Verifique a resposta do link para saber qual.

Finalmente, para responder à minha própria pergunta, no momento, não, não há como usar nenhum dos recursos do C # 8.0 dentro de uma exibição do Razor. A compilação em tempo de execução parece ser feita com um pacote nomeado, Microsoft.CodeDom.Providers.DotNetCompilerPlatformportanto, a única maneira seria atualizar esse pacote para permitir que alguns dos novos recursos sejam usados.

Vou atualizar essa resposta assim que receber mais informações.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.