C# 9.0 对顶级程序的支持 Visual Studio 2019

C# 9.0 Support for Top-level programs in Visual Studio 2019

随着 C# 9.0 和 .NET 5 的到来,引入了一个名为“顶级程序”的新功能。

此功能消除了创建简单 C# 应用程序所需的大量样板代码,因为不必将代码包装在通常的 namespace/class/Main 方法中,如 Welcome to C# 9.0 blog[= 中所述21=]

要创建一个简单的“Hello World”应用程序,顶级程序唯一需要的代码如下(摘自博客)

using System;

Console.WriteLine("Hello World!");

为了试用此功能,我在 Visual Studio 2019 (v16.6.5) 中安装了最新的 .NET 5 预览包 (5.0.100-preview.6.20318.15) 运行 并创建了以下从 VS 编译和运行的“正常”项目:

using System;

namespace TestProgram
{
    class Test
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello world!");
            var fooBar = "Foo" + "bar";
            Console.WriteLine(fooBar);
            Console.ReadLine();
        }
    }
}

为了测试顶级程序并查看可以(不)用它做什么,我去掉了名称空间、class 定义和 Main 方法:

using System;

Console.WriteLine("Hello world!"); // 1
var fooBar = "Foo" + "bar"; // 2
Console.WriteLine(fooBar); // 3
Console.ReadLine(); // 3

现在应该是有效的语法。这是项目中唯一的文件,据我所知,它符合该博客中提到的所有其他标准:

Any statement is allowed. The program has to occur after the usings and before any type or namespace declarations in the file, and you can only do this in one file, just as you can have only one Main method today.

然而在实践中,VS 强调了所有错误,阻止我在 VS 中编译为发布或调试。

(1) A namespace cannot direclty contain members such as fields or methods
(2) The contextual keyword 'var' may only appear within a local variable declaration or in script code
(3) The name Console.WriteLine(/ReadLine) does not exist in the current context

这是人们期望在 .NET 5 之前的 VS 中看到的内容,但是 .NET 5 肯定是启用的,语言预览功能也是如此。正如在 .csproj:

中看到的
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <LangVersion>preview</LangVersion>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

</Project>

对我来说奇怪的是,当我尝试使用 dotnet build 从 CLI 编译时,程序编译成功,可执行文件运行完美。

这里 Visual Studio 是否有问题,它还不支持这种语法,还是我必须在某处启用某些东西才能使顶级程序成为现实?

总结评论,您必须使用 Visual Studio 的最新预览版(这很明显,因为 C# 9 目前处于预览状态)或从控制台构建您的应用程序(就像您已经完成 dotnet build).

您可以使用 Roslyn 存储库中的 Language Feature Status 页面跟踪已实现功能的状态。如您所见,顶级语句功能已合并到 16.7p3 分支中。我想这意味着该功能至少可以在版本 16.7 预览版 3 中使用(您确认它可以在 16.7.0 预览版 4.0 版本中使用)。

作为一个选项,您也可以尝试sharplab.io该功能,只需在左侧面板的右上角切换一个 Roslyn 分支