如何在Razor视图中使用新的c#8.0功能

dbr*_*lon 13 c# asp.net-mvc razor

我已经更新了ASP.NET Mvc 5 Web应用程序,以通过Visual Studio 2019使用新的c#8.0功能,并且一切正常,直到我尝试在Razor视图中使用这些新功能为止。

例如,如果我尝试使用新的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>
Run Code Online (Sandbox Code Playgroud)

直到我尝试访问该页面时,编译器才会抱怨,这给了我编译错误。

编译错误

我怀疑Microsoft.CodeDom.Providers.DotNetCompilerPlatform必须更新,但似乎没有可用的更新。

有什么方法可以在Razor视图中使用c#8.0语言功能?

Ric*_*tam 7

.net框架支持C#7.3,因此无法使Razor View正常工作

.net core 3支持C#8,我能够使您的示例与.net Core 3 MVC应用程序一起使用。

您可以在这里查看:https : //docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/configure-language-version

希望以上内容对您有所帮助:)

  • 虽然你说的是真的。我**能够**通过简单地更改我的 csproj 中的 `LangVersion` 来在我的 .net 4.7.2 项目中使用 C# 8.0 功能。我什至可以使用可为空的功能。OP 建议的代码编译并运行得很好。有趣的是为什么这不适用于 ASP.NET 应用程序。 (2认同)

dbr*_*lon 6

好的,有一些事情需要先澄清。

根据这个答案, C# 语言版本与框架绑定,并且 C# 8.0 完全适用于支持 .Net Standard 2.1 的所有语言。.NET Framework 4.7.2 及以下版本不支持 .NET Standard 2.1,将来也不会如此。

同时,如果您在任何 .csproj 项目文件中指定 LangVersion,则有一种方法可以使用 C# 8.0:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net48</TargetFrameworks>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

这将启用 C# 8.0,并且您可以使用一些非绑定框架功能。检查链接答案以了解是哪一个。

最后回答我自己的问题,目前,不,无法在 Razor 视图中使用任何 C# 8.0 功能。运行时编译似乎是使用一个名为的包完成的,Microsoft.CodeDom.Providers.DotNetCompilerPlatform因此唯一的方法是更新该包以允许使用某些新功能。

我会在获得更多信息后立即更新该答案。