在 ASP.NET MVC 核心项目的视图中使用 C# 7 功能

Using C# 7 features inside of a View in an ASP.NET MVC Core project

我已经寻找过与此相关的其他问题,但 none 似乎正是我要找的。

我在 ASP.NET Core 上有一个网站 运行,具有 VS2017 中的新项目结构。使用 C#7 功能的代码文件编译良好。但是尝试在视图中使用这些功能会导致一系列语法错误。我尝试安装 Roslyn 以便在编译视图时使用它,因为据我所知,C#7 功能在 Roslyn nuget 包 2.x 及更高版本中可用。但现在我收到明确表示

的反馈

error CS8059: Feature 'out variable declaration' is not available in C# 6. Please use language version 7 or greater.

过去我会检查 web.config,但在 ASP.NET 核心项目中没有 web.config 除了根目录下几乎为空的用于处理请求的项目关闭 IIS。

我如何指示我的视图应该使用 Roslyn 编译,因为直到运行时才完成?至少我假设此时可以解决我的问题。

编辑: 正如我在开始时提到的那样,这个问题不是这个问题的重复,我还寻找了现有的问题。这就是在编译时在您的应用程序中专门启用 C#7 功能,并且仅适用于 ASP.NET 应用程序。我正在使用 ASP.NET 核心,它没有 web.config 以及其中定义的任何编译设置。另外,我正在尝试为在运行时编译并且可能位于不同系统上的视图执行此操作。

解法:

对于任何感兴趣的人,您必须将 Roslyn 添加到您的项目中(我知道),但您还必须配置 RazorViewEngineOptions 以使用 CSharpParseOptions 指示语言版本(默认为6).我已经这样做了,但我没有做正确。我需要将 WithLanguageVersion() 的结果分配到 ParseOptions 的顶部以替换它们。

services.AddMvc().AddRazorOptions(options => options.ParseOptions = options.ParseOptions.WithLanguageVersion(LanguageVersion.CSharp7));

所以我发现在 ConfigureServices() 调用中调用了一些公开的编译选项。

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc().AddRazorOptions(x => x.ParseOptions.WithLanguageVersion(LanguageVersion.CSharp7));
}

问题是 LanguageVersion.CSharp7 如果您不添加 Roslyn,则会出现错误。所以我认为这是必要的。

添加 Roslyn 后,编译一切正常,但视图仍然报错。

@{
    //My view code
    string s = "1";
    int.TryParse(s, out int i);
}

因此,如果 MVC 公开了一个 RazorOptions,您可以使用它来指定语言版本,为什么不接受它?

您可以尝试以下方法吗(ASP.NET 核心团队的成员推荐):

  1. 安装 Microsoft.CodeAnalysis.CSharp(版本 2.0.0)和 System.ValueTuple(版本 4.3.0)包
  2. 在 Startup.cs 的 ConfigureServices 方法中,通过执行以下操作将 Razor 配置为使用 C# 7:

    services.AddMvc().AddRazorOptions(options =>
         options.ParseOptions = new CSharpParseOptions(LanguageVersion.CSharp7));