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


14

我已经更新了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>

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

编译错误

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

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


这会有所帮助吗?- stackoverflow.com/questions/31689374/...
yob

好吧,这正是我发现它可能与Microsoft.CodeDom.Providers.DotNetCompilerPlatform软件包有关的地方,但是我无法使其在c#8.0中起作用
dbraillon

为我工作,-我将对Microsoft.CodeDom.Providers.DotNetCompilerPlatform的引用更新为版本#2.0.1(安装包Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Version 2.0.1)
yob

我刚刚尝试了一个新的解决方案:使用.Net Framework使用默认的mvc模板创建一个新的解决方案,编写一些c#8.0代码,visual studio询问我是否要更新我的项目以使用c#8.0,接受它,然后编写与视图相同的代码。它确实可以编译,但不会在运行时执行...
dbraillon

在这个问题上有运气吗?
eaglei22 '19

Answers:


6

.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

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


虽然你说的是真的。我能够通过简单地改变使用我的.NET 4.7.2项目C#8.0的功能LangVersion在我的csproj。我什至可以使用可为空的功能。OP建议的代码可以编译并正常运行。因此,有趣的是,为什么这对于ASP.NET应用程序不起作用。
Thomas Heijtink

@ThomasHeijtink,请参阅Microsoft.CodeDom.Providers.DotNetCompilerPlatform的最新更新是在一年前- 2018 年9月13日。因此,捆绑的编译器现在不支持C#8功能。
大厅

1
@ThomasHeijtink,您可以为存储库做出贡献。我相信,你只需要使用的最后一个版本Microsoft.Net.CompilersRoslynCodeProvider.settings.targets<MSNetCompilersNuGetPackageLatestVersion>3.3.1</MSNetCompilersNuGetPackageLatestVersion>。您可以从源代码构建自己的nuget软件包并使用它(或进行PR并获得反馈,希望将其合并到master中)。
大厅

有没有人尝试过叉子?我在GitHub上看不到一个(添加了此更改)。我的目标是逐步将ASP.NET Classic项目过渡到核心,并使一些代码停留在7.x上会带来伤害。
索伦Kuklau

2

好的,因此,首先需要澄清一些事情。

根据此答案, C#语言版本与框架绑定在一起,并且所有支持.Net Standard 2.1的语言都可以使用C#8.0。.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>

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.