C# 9.0 Поддержка программ верхнего уровня в Visual Studio 2019
С выходом 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 в том, что она еще не поддерживает этот синтаксис, или мне нужно где-нибудь включить что-то, чтобы сделать программы верхнего уровня чем-то?
1 ответ
Подводя итоги комментариев, вы должны использовать последнюю предварительную версию Visual Studio (это очевидно, потому что C# 9 находится в состоянии предварительного просмотра прямо сейчас) или создать приложение с консоли (как вы уже сделали с dotnet build
).
Вы можете отслеживать статус реализованных функций на странице состояния языковых функций в репозитории Roslyn. Как видите, функция операторов верхнего уровня была объединена в ветку 16.7p3. Я полагаю, это означает, что функция будет работать как минимум в версии 16.7 preview 3 (вы подтвердили, что она работает в версии 16.7.0 preview 4.0).
Как вариант, вы также можете попробовать https://sharplab.io/ для этой функции, просто переключите ветку Roslyn в верхнем правом углу левой панели.