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?

dbraillon
fonte
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 :)

Ricky Stam
fonte
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.

dbraillon
fonte