С появлением C # 9.0 и .NET 5 появилась новая функция, называемая программами верхнего уровня.
Эта функциональность избавляет от большого количества шаблонного кода, необходимого для создания простого приложения C #, поскольку вам не нужно заключать код в обычный метод namespace / class / Main, как описано в Добро пожаловать в блог C # 9.0
Для создания простого приложения Hello World требуется только следующий код для программы верхнего уровня (взят из блога)
using System;
Console.WriteLine("Hello World!");
Чтобы опробовать эту функцию, я установил последний предварительный пакет .NET 5 (5.0.100-preview.6.20318.15), работающий в Visual Studio 2019 (v16.6.5), и создал следующий нормальный проект, который компилируется и запускается из wihtin 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();
}
}
}
Чтобы протестировать программу верхнего уровня и посмотреть, что (что нельзя) с ней сделать, я избавился от пространства имен, определения класса и метода Main:
using System;
Console.WriteLine("Hello world!"); // 1
var fooBar = "Foo" + "bar"; // 2
Console.WriteLine(fooBar); // 3
Console.ReadLine(); // 3
Который теперь должен быть действующим синтаксисом. Это единственный файл в проекте, и, насколько мне известно, он соответствует всем другим критериям, упомянутым в этом блоге:
Допускается любое заявление. Программа должна выполняться после использования и до объявления любого типа или пространства имен в файле, и вы можете сделать это только в одном файле, так же как сегодня у вас может быть только один метод Main.
Однако на практике VS подчеркивает все с ошибками, мешающими мне компилировать как выпуск, так и отладку из VS.
(1) Пространство имен не может напрямую содержать такие элементы, как поля или методы
(2) Контекстное ключевое слово 'var' может появляться только в объявлении локальной переменной или в коде сценария
(3) ИмяConsole.WriteLine(/ReadLine)
не существует в текущем контексте
Это то, что можно было бы ожидать от VS pre- .NET 5, однако .NET 5, безусловно, включен, как и функции предварительного просмотра языка. Как видно на .csproj
:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<LangVersion>preview</LangVersion>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
</Project>
Для меня странно то, что когда я пытаюсь скомпилировать из CLI с помощью dotnet build
, программа компилируется, и исполняемый файл работает безупречно.
Виновата ли Visual Studio в том, что она еще не поддерживает этот синтаксис, или мне нужно где-то включить что-то, чтобы сделать программы верхнего уровня чем-то особенным?