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 в верхнем правом углу левой панели.

Другие вопросы по тегам