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 в том, что она еще не поддерживает этот синтаксис, или мне нужно где-то включить что-то, чтобы сделать программы верхнего уровня чем-то особенным?


person Remy    schedule 18.07.2020    source источник
comment
Попробуйте установить последнюю предварительную версию VS или запустите код из командной строки. Вы также можете просмотреть комментарии в этом ответе, чтобы получить некоторые подсказки.   -  person Pavel Anikhouski    schedule 18.07.2020
comment
Превосходно! @PavelAnikhouski Запуск VS версии 16.7.0 preview 4.0 работает с программным синтаксисом верхнего уровня (хотя я, кажется, не могу найти подробностей об этом в примечаниях к патчу).   -  person Remy    schedule 20.07.2020
comment
Вы можете проверить статус реализованных функций, используя Статус языковой функции страница   -  person Pavel Anikhouski    schedule 20.07.2020
comment
@PavelAnikhouski аккуратный, не знал этого. Если вы можете преобразовать свой комментарий + страницу с языковыми функциями в ответ, я приму его :)   -  person Remy    schedule 20.07.2020


Ответы (1)


Подводя итог комментариям, вы должны использовать последнюю предварительную версию Visual Studio (это очевидно, потому что C # 9 сейчас находится в состоянии предварительного просмотра) или создать приложение с консоли (как вы уже сделали с dotnet build).

Вы можете отслеживать статус реализованных функций, используя Статус языковой функции в репо Roslyn. Как видите, функция операторов верхнего уровня была объединена в ветку 16.7p3. Полагаю, это означает, что функция будет работать как минимум в версии 16.7 preview 3 (вы подтвердили, что она работает в версии 16.7.0 preview 4.0).

Как вариант, вы можете также попробовать sharplab.io для этой функции, просто переключить ветку Roslyn в верхнем правом углу левой панели

person Pavel Anikhouski    schedule 20.07.2020