Только одна единица компиляции может содержать инструкции верхнего уровня ошибка

Операторы верхнего уровня — программы без Main методов Начиная с версии C# 9, метод Main не нужно явно включать в проект консольного приложения. Вместо этого можно использовать операторы верхнего уровня для минимизации объема создаваемого кода. В этом случае компилятор создает класс и точку входа метода Main для приложения. Вот файл Program.cs , который является […]

Содержание

  1. Операторы верхнего уровня — программы без Main методов
  2. Только один файл верхнего уровня
  3. Другие точки входа отсутствуют
  4. Директивы using
  5. Глобальное пространство имен
  6. Пространства имен и определения типов
  7. await
  8. Код завершения для процесса
  9. Неявный метод точки входа
  10. Спецификация языка C#
  11. C# Только одна единица компиляции может иметь операторы верхнего уровня.
  12. 1 ответ
  13. Program.cs is hung up error CS8802 #7074
  14. Comments
  15. Footer
  16. Roslyn: Ошибки компилятора должны иметь лучшее сообщение об ошибке
  17. Все 3 Комментарий

Операторы верхнего уровня — программы без Main методов

Начиная с версии C# 9, метод Main не нужно явно включать в проект консольного приложения. Вместо этого можно использовать операторы верхнего уровня для минимизации объема создаваемого кода. В этом случае компилятор создает класс и точку входа метода Main для приложения.

Вот файл Program.cs , который является полной программой C# в C# 10:

Операторы верхнего уровня позволяют создавать простой программный код для небольших служебных программ, таких как Функции Azure и GitHub Actions. Они также помогают начинающим программистам C# начать обучение и приступить к написанию кода.

В следующих разделах описываются правила, которые определяют использование операторов верхнего уровня.

Только один файл верхнего уровня

Приложение должно иметь только одну точку входа. Проект может содержать только один файл с операторами верхнего уровня. Размещение операторов верхнего уровня в нескольких файлах в проекте приводит к следующей ошибке компилятора:

CS8802 Only one compilation unit can have top-level statements (Только одна единица компиляции может содержать операторы верхнего уровня).

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

Другие точки входа отсутствуют

Метод Main можно написать явным образом, но он не может функционировать как точка входа. Компилятор выдает следующее предупреждение:

CS7022 The entry point of the program is global code; ignoring ‘Main()’ entry point (Точка входа программы является глобальным кодом; точка входа Main() игнорируется).

В проекте с операторами верхнего уровня нельзя использовать параметр компилятора -main для выбора точки входа, даже если в проекте есть один или несколько методов Main .

Директивы using

Если вы включаете директивы using, они должны быть первыми в файле, как показано в следующем примере:

Глобальное пространство имен

Операторы верхнего уровня неявно находятся в глобальном пространстве имен.

Пространства имен и определения типов

Файл с операторами верхнего уровня может также содержать пространства имен и определения типов, но они должны следовать за операторами верхнего уровня. Пример:

Операторы верхнего уровня могут ссылаться на переменную args для обращения к любым введенным аргументам командной строки. Переменная args никогда не имеет значение NULL, но ее значение Length равно нулю, если не были предоставлены аргументы командной строки. Пример:

await

Асинхронный метод можно вызвать с помощью await . Пример:

Код завершения для процесса

Чтобы вернуть значение int при завершении работы приложения, используйте оператор return , как в методе Main , который возвращает int . Пример:

Неявный метод точки входа

Компилятор создает метод, используемый в качестве точки входа программы для проекта с операторами верхнего уровня. Имя этого метода на самом деле не Main , это описание реализации, на которое код не может ссылаться напрямую. Сигнатура метода зависит от того, содержат ли операторы верхнего уровня ключевое слово await или оператор return . В следующей таблице показано, как будет выглядеть сигнатура метода; имя метода Main в таблице используется для удобства.

Код верхнего уровня содержит Неявная сигнатура Main
await и return static async Task Main(string[] args)
await static async Task Main(string[] args)
return static int Main(string[] args)
Ни await , ни return static void Main(string[] args)

Спецификация языка C#

Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

Источник

C# Только одна единица компиляции может иметь операторы верхнего уровня.

Я только начал изучать С#, я создал консольное приложение С#. Чтобы понять концепции, я посмотрел видео о том, как настроить vs code для c#.

Когда я запускаю команду dotnet new console в терминале кода VS, он создает новый проект, включающий файл Program.cs .

В видео файл Program.cs выглядит так

Program.cs в моей среде IDE выглядит так:

Когда я запускаю код с помощью терминала dotnet run , он отлично работает на моем компьютере.

Когда я создаю новый файл cs, он содержит

После запуска он говорит Only one compilation unit can have top-level statements.

Когда я использую метод класса и пространство имен, например

Он запускает файл Program.cs , а не новый файл, и показывает это предупреждение

PS C:UsersUserC#projects> dotnet run hello.cs C:UsersUserC#projectshello.cs(5,21): warning CS7022: The entry point of the program is global code; ignoring ‘hello.Main()’ entry point. [C:UsersUserC#projectsC#projects.csproj] Hello, World!

Структура проекта:

Я попробовал другой метод, нажав run and debug и ничего не показав.

Когда я нажимаю кнопку Создать ресурсы c# для сборки и отладки, отображается это

Не удалось найти проект .NET Core. Активы не генерировались.

1 ответ

Функция C# 9: операторы верхнего уровня

Это новая функция C# 9, которая называется Утверждения верхнего уровня

Видео, на которое вы ссылаетесь, может использовать более низкую версию C# (ниже, чем C# 9). Где мы используем, чтобы получить

Как стандартная структура основной программы.

Если вы внимательно посмотрите, вы обнаружите только одну строку кода, которая выводит строку на консоль, т.е.

Операторы верхнего уровня были введены для удаления ненужных церемоний из этого консольного приложения.

Поскольку вы используете C#9 или выше, dot net run с оператором верхнего уровня успешно компилирует ваш код, но когда вы заменяете однострочный код на устаревшую структуру, компилятор предупреждает вас о глобальной записи функции Main и Функция Main(), которую вы добавили, заменив оператор верхнего уровня.

Чтобы получить больше ясности, вы можете просмотреть документацию MSDN: Утверждения верхнего уровня

Почему вы получаете сообщение об ошибке «Только одна единица компиляции может иметь операторы верхнего уровня»?

  • Согласно документация MSDN. Приложение должно иметь только одну точку входа.
  • В проекте может быть только один файл с операторами верхнего уровня.
  • Когда вы создали новый файл, вы добавили новый оператор верхнего уровня, что привело к следующей ошибке времени компиляции:

CS8802 Только одна единица компиляции может иметь операторы верхнего уровня.

как это исправить?

  • Согласно приведенному выше объяснению, ваш проект не должен содержать двух или более операторов верхнего уровня. Чтобы исправить эту ошибку, вы можете удалить файл, который был добавлен позже.

Источник

Program.cs is hung up error CS8802 #7074

Provide details about the problem you’re experiencing. Include your operating system version, exact error message, code sample, and anything else that is relevant.
// See https://aka.ms/new-console-template for more information
Console.WriteLine(«Hello, World!»);
Console.WriteLine(«The current time is » + DateTime.Now);

C:UsersMunmunlinaMyApp>dotnet run
C:UsersMunmunlinaMyAppProgram.cs(2,1): error CS8802: Only one compilation unit can have top-level statements. [C:UsersMunmunlinaMyAppMyApp.csproj]

The build failed. Fix the build errors and run again.

The text was updated successfully, but these errors were encountered:

Hello @munmunlina. Thanks for submitting this issue.

That error leads me to believe you have another C# file in your MyApp folder, perhaps from a previous tutorial or step in the tutorial. If there are multiple C# files in the folder that have top-level statements (without being wrapped in classes/methods), then the compilation will fail with this message.

If Program.cs was the only C# file within this folder (or subfolders), then please reply here with the list of files and their contents that are in that folder.

© 2023 GitHub, Inc.

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

Roslyn: Ошибки компилятора должны иметь лучшее сообщение об ошибке

Вот несколько сообщений об ошибках, которые были предложены как неясные:

CS0029 — Невозможно неявно преобразовать X в Y
CS0103 — X не существует в текущем контексте
CS0161 — Не все пути кода возвращают значение
CS0165 — Использование неназначенной локальной переменной
CS1002 — ожидается точка с запятой
CS1513 -> ожидается (отсутствует область закрытия)
CS1525 — Неверный термин выражения. В частности, при использовании == вместо = для присваивания (например, int i == 4)
CS7036 — Не указан аргумент, соответствующий обязательному формальному параметру (неправильный вызов метода)

Не стесняйтесь комментировать эту проблему с другими сообщениями об ошибках, которые сегодня неясны.

Все 3 Комментарий

Не стесняйтесь комментировать эту проблему с другими сообщениями об ошибках, которые сегодня неясны.

  • CS8802: только одна единица компиляции может иметь операторы верхнего уровня.
  • CS8804: Невозможно указать / main, если есть модуль компиляции с операторами верхнего уровня.

Я знаю, что они означают, но я думаю, что термин «единица компиляции» — это язык компьютерных ботаников, который новички не поймут, и это не то, что они могут легко найти. Подробнее здесь: https://github.com/dotnet/roslyn/issues/45926

Мне любопытно, что было бы суггестоинами в качестве лучших сообщений об ошибках. Например:

CS0103 — X не существует в текущем контексте

Не уверен, что еще мы можем там сказать. пользователь написал здесь ‘X’ . но мы не смогли найти X, который существует здесь .

Обратите внимание, что я категорически не хочу, чтобы у нас были слишком подробные диагностические сообщения, которые требовали переноса или нескольких строк для объяснения в списке ошибок. И для всех этих ошибок у нас есть гиперссылки на большие страницы с объяснениями, помогающие дать полный контекст того, что они означают, когда они происходят и как их можно исправить.

@CyrusNajmabadi Если это похоже на опечатку, сообщение об ошибке может предлагать правильное написание. В случае, если X существует в соседней области (как в примере в документации ), сообщение может содержать короткое предложение о том, что область этой переменной здесь не распространяется. (В этом случае было бы здорово каким-то образом указать на эту переменную, но я не думаю, что есть хороший способ сделать это.)

Такие эвристики не всегда угадывают истинную причину ошибки, но я думаю, что они могут быть правильными достаточно часто, чтобы быть полезными.

Источник

MrGray

0 / 0 / 0

Регистрация: 15.07.2022

Сообщений: 14

1

.NET 6

15.07.2022, 00:22. Показов 3639. Ответов 1

Метки нет (Все метки)


Задали написание решение для задачки. Начинаю писать

C#
1
2
3
int i=0;
int N=20;
while(i<=N)

в строке «int i=0» int выделяет как ошибку. Пишет
«readonly struct System.Int32
Represents a 32-bit signed integer.
Только одна единица компиляции может содержать инструкции верхнего уровня. [009, 009, 009]csharp(CS8802)»
Хотя у другого человека при написании той же информации на другом ПК все в порядке, ошибок нет.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Администратор

Эксперт .NET

15258 / 12296 / 4907

Регистрация: 17.03.2014

Сообщений: 24,903

Записей в блоге: 1

15.07.2022, 00:53

2

MrGray, вот ключевой момент

Цитата
Сообщение от MrGray
Посмотреть сообщение

Только одна единица компиляции может содержать инструкции верхнего уровня.

У вас в проекте есть еще один файл где вы писали код без явного объявления класса и метода Main — то что и называется «инструкции верхнего уровня». Закоментируйте их в другом файла или создайте новый проект для своей задачи.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

15.07.2022, 00:53

Помогаю со студенческими работами здесь

В документах XML допускается только один элемент верхнего уровня
Вопрос про Xml, но он связан с XmlSerialization, по-этому пишу сюда.

&quot;В документе XML (2, 118)…

Можно ли получить только дочерний текст(верхнего уровня) элемента
Есть такой кусок HTML:

&lt;div class=&quot;price&quot;&gt;
13 200 руб.
&lt;div class=&quot;quantity&quot;&gt;
x2 — 26…

Ошибка при компиляции error: cannot convert ‘int (*)[5]’ to ‘double**’ for argument ‘1’ to ‘int INVERSE(double**, i
Помогите ,пожалуйста исправить ошибку. Если я правильно ,я неправильно пользуюсь указателем в…

Получить список, элементами которого будут являться только атомы верхнего уровня
1. Из заданного списка получить список, элементами которого будут являться только атомы верхнего…

Map <int, CustomClass*> — ошибка при компиляции
Добрый день!
Пытаюсь объявить такое:

map&lt;int, Letter*&gt; LetterMap;

При компиляции следующие…

Segmentation fault (core dumped): ошибка при любом вводе после компиляции
Всем доброго времени суток. Не могли бы посмотреть программу и подсказать ошибку. При компиляции…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

2

Как исправить ошибку оператора верхнего уровня?

Программа1.cs Обычный файл C#, работает отлично.

Random numberGen = new Random();

int roll1 = 1;
int roll2 = 0;
int roll3 = 0;
int roll4 = 0;

int attempts = 0;

Console.WriteLine("Press enter to roll the dies");

while (roll1 != roll2 || roll2 != roll3 || roll3 != roll4 || roll4 != roll1)
{
    Console.ReadKey();

    roll1 = numberGen.Next(1, 7);
    roll2 = numberGen.Next(1, 7);
    roll3 = numberGen.Next(1, 7);
    roll4 = numberGen.Next(1, 7);
    Console.WriteLine("Dice 1: " + roll1 + "nDice 2: " + roll2 + "nDice 3: " + roll3 + "nDice 4: " + roll4 + "n");
    attempts++;
}

Console.WriteLine("It took " + attempts + " attempts to roll a four of a kind.");

Console.ReadKey();

Программа2.cs

Console.ReadKey();

Под модулем Консоль выскакивает ошибка:
Только одна единица компиляции может иметь операторы верхнего уровня. Ошибка: CS8802

Я пробовал в терминале новая консоль dotnet —force, но он просто удаляет мою программу.
Я хочу запустить несколько файлов C# в одной папке, не получая
Только одна единица компиляции может иметь операторы верхнего уровня. или другие подобные ошибки.


Canyon, 10 апреля 2022 г., 12:45

2

51

1


Ответ:

Решено

В dotnet 6 для основного метода не требуется имя класса.

Поэтому, когда у вас есть 2 класса, у которых нет класса и пространства имен, компилятор думает, что у вас есть 2 основных метода.

Итак, вы делаете что-то вроде

namespace ConsoleApp1;

class Program1
{
    public static void GetRolling()
    {
        Random numberGen = new Random();

        int roll1 = 1;
        int roll2 = 0;
        int roll3 = 0;
        int roll4 = 0;

        int attempts = 0;

        Console.WriteLine("Press enter to roll the dies");

        while (roll1 != roll2 || roll2 != roll3 || roll3 != roll4 || roll4 != roll1)
        {
            Console.ReadKey();

            roll1 = numberGen.Next(1, 7);
            roll2 = numberGen.Next(1, 7);
            roll3 = numberGen.Next(1, 7);
            roll4 = numberGen.Next(1, 7);
            Console.WriteLine("Dice 1: " + roll1 + "nDice 2: " + roll2 + "nDice 3: " + roll3 + "nDice 4: " + roll4 + "n");
            attempts++;
        }

        Console.WriteLine("It took " + attempts + " attempts to roll a four of a kind.");
    }
}

А для программы2 некоторые думают так:

namespace ConsoleApp1;

public class Program2
{
    public static void Main(string[] args)
    {
        Program1.GetRolling();
        Console.ReadKey();
    }
}

В противном случае это все равно, что сказать 2 раза public static void Main(string[] args), а это невозможно.


Maytham, 10 апреля 2022 г., 13:47

Интересные вопросы для изучения

Я только начал изучать С#, я создал консольное приложение С#. Чтобы понять концепции, я посмотрел видео о том, как настроить vs code для c#.

Когда я запускаю команду dotnet new console в терминале кода VS, он создает новый проект, включающий файл Program.cs.

В видео файл Program.cs выглядит так

// Program.cs
using System;
namespace HelloWorld
{
  class Program
  {
    static string Main(string[] args)
    {
      Console.WriteLine("Hello, World!");
    }
  }
}

Program.cs в моей среде IDE выглядит так:

// Program.cs
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

Когда я запускаю код с помощью терминала dotnet run, он отлично работает на моем компьютере.

Когда я создаю новый файл cs, он содержит

// hello.cs
Console.WriteLine("hello world");

После запуска он говорит Only one compilation unit can have top-level statements.

Когда я использую метод класса и пространство имен, например

// hello.cs
namespace helloworld
{
    class hello
    {
        static void Main()
        {
            Console.WriteLine("hello world");

        }
    }
}

Он запускает файл Program.cs, а не новый файл, и показывает это предупреждение

PS C:UsersUserC#projects> dotnet run hello.cs C:UsersUserC#projectshello.cs(5,21): warning CS7022: The entry point of the program is global code; ignoring 'hello.Main()' entry point. [C:UsersUserC#projectsC#projects.csproj] Hello, World!

Структура проекта:

enter image description here

Я попробовал другой метод, нажав run and debug и ничего не показав.

Когда я нажимаю кнопку Создать ресурсы c# для сборки и отладки, отображается это

Не удалось найти проект .NET Core. Активы не генерировались.

1 ответ

Лучший ответ

Функция C# 9: операторы верхнего уровня

Это новая функция C# 9, которая называется Утверждения верхнего уровня

Видео, на которое вы ссылаетесь, может использовать более низкую версию C# (ниже, чем C# 9). Где мы используем, чтобы получить

namespace helloworld
{
    class hello
    {
        static void Main()
        {
            Console.WriteLine("hello world");  
        }
    }
}

Как стандартная структура основной программы.

Если вы внимательно посмотрите, вы обнаружите только одну строку кода, которая выводит строку на консоль, т.е.

Console.WriteLine("hello world");  

Операторы верхнего уровня были введены для удаления ненужных церемоний из этого консольного приложения.

Поскольку вы используете C#9 или выше, dot net run с оператором верхнего уровня успешно компилирует ваш код, но когда вы заменяете однострочный код на устаревшую структуру, компилятор предупреждает вас о глобальной записи функции Main и Функция Main(), которую вы добавили, заменив оператор верхнего уровня.

Чтобы получить больше ясности, вы можете просмотреть документацию MSDN: Утверждения верхнего уровня


Почему вы получаете сообщение об ошибке «Только одна единица компиляции может иметь операторы верхнего уровня»?

  • Согласно документация MSDN. Приложение должно иметь только одну точку входа.
  • В проекте может быть только один файл с операторами верхнего уровня.
  • Когда вы создали новый файл, вы добавили новый оператор верхнего уровня, что привело к следующей ошибке времени компиляции:

CS8802 Только одна единица компиляции может иметь операторы верхнего уровня.


как это исправить?

  • Согласно приведенному выше объяснению, ваш проект не должен содержать двух или более операторов верхнего уровня. Чтобы исправить эту ошибку, вы можете удалить файл, который был добавлен позже.


6

Prasad Telkikar
7 Июн 2022 в 18:39

I just started learning c#, I created C# console application. To understand the concepts, I watched videos of how to setup vs code for c#

When I run the dotnet new console command in VS code terminal, it creates a new project including Program.cs file.

In the video, the Program.cs file appears like that

// Program.cs
using System;
namespace HelloWorld
{
  class Program
  {
    static string Main(string[] args)
    {
      Console.WriteLine("Hello, World!");
    }
  }
}

Program.cs in my IDE appears like,

// Program.cs
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

When I run the code using terminal dotnet run it runs perfectly on my computer.

when I create a new cs file, it contains

// hello.cs
Console.WriteLine("hello world");

after running it says Only one compilation unit can have top-level statements.

when I use class method and namespace like

// hello.cs
namespace helloworld
{
    class hello
    {
        static void Main()
        {
            Console.WriteLine("hello world");

        }
    }
}

it runs THE Program.cs file not the new file and shows this warning

PS C:UsersUserC#projects> dotnet run hello.cs C:UsersUserC#projectshello.cs(5,21): warning CS7022: The entry point of the program is global code; ignoring 'hello.Main()' entry point. [C:UsersUserC#projectsC#projects.csproj] Hello, World!

Project structure:

enter image description here

I tried another method by pressing run and debug and show nothing.

When I click on Generate c# Assets for Build and Debug button it shows this

Could not locate .NET Core project. Assets were not generated.

I just started learning c#, I created C# console application. To understand the concepts, I watched videos of how to setup vs code for c#

When I run the dotnet new console command in VS code terminal, it creates a new project including Program.cs file.

In the video, the Program.cs file appears like that

// Program.cs
using System;
namespace HelloWorld
{
  class Program
  {
    static string Main(string[] args)
    {
      Console.WriteLine("Hello, World!");
    }
  }
}

Program.cs in my IDE appears like,

// Program.cs
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

When I run the code using terminal dotnet run it runs perfectly on my computer.

when I create a new cs file, it contains

// hello.cs
Console.WriteLine("hello world");

after running it says Only one compilation unit can have top-level statements.

when I use class method and namespace like

// hello.cs
namespace helloworld
{
    class hello
    {
        static void Main()
        {
            Console.WriteLine("hello world");

        }
    }
}

it runs THE Program.cs file not the new file and shows this warning

PS C:UsersUserC#projects> dotnet run hello.cs C:UsersUserC#projectshello.cs(5,21): warning CS7022: The entry point of the program is global code; ignoring 'hello.Main()' entry point. [C:UsersUserC#projectsC#projects.csproj] Hello, World!

Project structure:

enter image description here

I tried another method by pressing run and debug and show nothing.

When I click on Generate c# Assets for Build and Debug button it shows this

Could not locate .NET Core project. Assets were not generated.

Comments

@munmunlina

Problem encountered on https://dotnet.microsoft.com/en-us/learn/dotnet/hello-world-tutorial/edit
Operating System: windows

Provide details about the problem you’re experiencing. Include your operating system version, exact error message, code sample, and anything else that is relevant.
// See https://aka.ms/new-console-template for more information
Console.WriteLine(«Hello, World!»);
Console.WriteLine(«The current time is » + DateTime.Now);

C:UsersMunmunlinaMyApp>dotnet run
C:UsersMunmunlinaMyAppProgram.cs(2,1): error CS8802: Only one compilation unit can have top-level statements. [C:UsersMunmunlinaMyAppMyApp.csproj]

The build failed. Fix the build errors and run again.

@jeffhandley

Hello @munmunlina. Thanks for submitting this issue.

That error leads me to believe you have another C# file in your MyApp folder, perhaps from a previous tutorial or step in the tutorial. If there are multiple C# files in the folder that have top-level statements (without being wrapped in classes/methods), then the compilation will fail with this message.

If Program.cs was the only C# file within this folder (or subfolders), then please reply here with the list of files and their contents that are in that folder.

2 participants

@jeffhandley

@munmunlina

В dotnet 6 для основного метода не требуется имя класса.

Поэтому, когда у вас есть 2 класса, у которых нет класса и пространства имен, компилятор думает, что у вас есть 2 основных метода.

Итак, вы делаете что-то вроде

namespace ConsoleApp1;

class Program1
{
    public static void GetRolling()
    {
        Random numberGen = new Random();

        int roll1 = 1;
        int roll2 = 0;
        int roll3 = 0;
        int roll4 = 0;

        int attempts = 0;

        Console.WriteLine("Press enter to roll the dies");

        while (roll1 != roll2 || roll2 != roll3 || roll3 != roll4 || roll4 != roll1)
        {
            Console.ReadKey();

            roll1 = numberGen.Next(1, 7);
            roll2 = numberGen.Next(1, 7);
            roll3 = numberGen.Next(1, 7);
            roll4 = numberGen.Next(1, 7);
            Console.WriteLine("Dice 1: " + roll1 + "nDice 2: " + roll2 + "nDice 3: " + roll3 + "nDice 4: " + roll4 + "n");
            attempts++;
        }

        Console.WriteLine("It took " + attempts + " attempts to roll a four of a kind.");
    }
}

А для программы2 некоторые думают так:

namespace ConsoleApp1;

public class Program2
{
    public static void Main(string[] args)
    {
        Program1.GetRolling();
        Console.ReadKey();
    }
}

В противном случае это все равно, что сказать 2 раза public static void Main(string[] args), а это невозможно.

Как исправить ошибку оператора верхнего уровня?

Программа1.cs Обычный файл C#, работает отлично.

Random numberGen = new Random();

int roll1 = 1;
int roll2 = 0;
int roll3 = 0;
int roll4 = 0;

int attempts = 0;

Console.WriteLine("Press enter to roll the dies");

while (roll1 != roll2 || roll2 != roll3 || roll3 != roll4 || roll4 != roll1)
{
    Console.ReadKey();

    roll1 = numberGen.Next(1, 7);
    roll2 = numberGen.Next(1, 7);
    roll3 = numberGen.Next(1, 7);
    roll4 = numberGen.Next(1, 7);
    Console.WriteLine("Dice 1: " + roll1 + "nDice 2: " + roll2 + "nDice 3: " + roll3 + "nDice 4: " + roll4 + "n");
    attempts++;
}

Console.WriteLine("It took " + attempts + " attempts to roll a four of a kind.");

Console.ReadKey();

Программа2.cs

Console.ReadKey();

Под модулем Консоль выскакивает ошибка:
Только одна единица компиляции может иметь операторы верхнего уровня. Ошибка: CS8802

Я пробовал в терминале новая консоль dotnet —force, но он просто удаляет мою программу.
Я хочу запустить несколько файлов C# в одной папке, не получая
Только одна единица компиляции может иметь операторы верхнего уровня. или другие подобные ошибки.


Canyon, 10 апреля 2022 г., 12:45

2

51

1


Ответ:

Решено

В dotnet 6 для основного метода не требуется имя класса.

Поэтому, когда у вас есть 2 класса, у которых нет класса и пространства имен, компилятор думает, что у вас есть 2 основных метода.

Итак, вы делаете что-то вроде

namespace ConsoleApp1;

class Program1
{
    public static void GetRolling()
    {
        Random numberGen = new Random();

        int roll1 = 1;
        int roll2 = 0;
        int roll3 = 0;
        int roll4 = 0;

        int attempts = 0;

        Console.WriteLine("Press enter to roll the dies");

        while (roll1 != roll2 || roll2 != roll3 || roll3 != roll4 || roll4 != roll1)
        {
            Console.ReadKey();

            roll1 = numberGen.Next(1, 7);
            roll2 = numberGen.Next(1, 7);
            roll3 = numberGen.Next(1, 7);
            roll4 = numberGen.Next(1, 7);
            Console.WriteLine("Dice 1: " + roll1 + "nDice 2: " + roll2 + "nDice 3: " + roll3 + "nDice 4: " + roll4 + "n");
            attempts++;
        }

        Console.WriteLine("It took " + attempts + " attempts to roll a four of a kind.");
    }
}

А для программы2 некоторые думают так:

namespace ConsoleApp1;

public class Program2
{
    public static void Main(string[] args)
    {
        Program1.GetRolling();
        Console.ReadKey();
    }
}

В противном случае это все равно, что сказать 2 раза public static void Main(string[] args), а это невозможно.


Maytham, 10 апреля 2022 г., 13:47

Интересные вопросы для изучения

Я только начал изучать С#, я создал консольное приложение С#. Чтобы понять концепции, я посмотрел видео о том, как настроить vs code для c#.

Когда я запускаю команду dotnet new console в терминале кода VS, он создает новый проект, включающий файл Program.cs.

В видео файл Program.cs выглядит так

// Program.cs
using System;
namespace HelloWorld
{
  class Program
  {
    static string Main(string[] args)
    {
      Console.WriteLine("Hello, World!");
    }
  }
}

Program.cs в моей среде IDE выглядит так:

// Program.cs
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

Когда я запускаю код с помощью терминала dotnet run, он отлично работает на моем компьютере.

Когда я создаю новый файл cs, он содержит

// hello.cs
Console.WriteLine("hello world");

После запуска он говорит Only one compilation unit can have top-level statements.

Когда я использую метод класса и пространство имен, например

// hello.cs
namespace helloworld
{
    class hello
    {
        static void Main()
        {
            Console.WriteLine("hello world");

        }
    }
}

Он запускает файл Program.cs, а не новый файл, и показывает это предупреждение

PS C:UsersUserC#projects> dotnet run hello.cs C:UsersUserC#projectshello.cs(5,21): warning CS7022: The entry point of the program is global code; ignoring 'hello.Main()' entry point. [C:UsersUserC#projectsC#projects.csproj] Hello, World!

Структура проекта:

enter image description here

Я попробовал другой метод, нажав run and debug и ничего не показав.

Когда я нажимаю кнопку Создать ресурсы c# для сборки и отладки, отображается это

Не удалось найти проект .NET Core. Активы не генерировались.

1 ответ

Лучший ответ

Функция C# 9: операторы верхнего уровня

Это новая функция C# 9, которая называется Утверждения верхнего уровня

Видео, на которое вы ссылаетесь, может использовать более низкую версию C# (ниже, чем C# 9). Где мы используем, чтобы получить

namespace helloworld
{
    class hello
    {
        static void Main()
        {
            Console.WriteLine("hello world");  
        }
    }
}

Как стандартная структура основной программы.

Если вы внимательно посмотрите, вы обнаружите только одну строку кода, которая выводит строку на консоль, т.е.

Console.WriteLine("hello world");  

Операторы верхнего уровня были введены для удаления ненужных церемоний из этого консольного приложения.

Поскольку вы используете C#9 или выше, dot net run с оператором верхнего уровня успешно компилирует ваш код, но когда вы заменяете однострочный код на устаревшую структуру, компилятор предупреждает вас о глобальной записи функции Main и Функция Main(), которую вы добавили, заменив оператор верхнего уровня.

Чтобы получить больше ясности, вы можете просмотреть документацию MSDN: Утверждения верхнего уровня


Почему вы получаете сообщение об ошибке «Только одна единица компиляции может иметь операторы верхнего уровня»?

  • Согласно документация MSDN. Приложение должно иметь только одну точку входа.
  • В проекте может быть только один файл с операторами верхнего уровня.
  • Когда вы создали новый файл, вы добавили новый оператор верхнего уровня, что привело к следующей ошибке времени компиляции:

CS8802 Только одна единица компиляции может иметь операторы верхнего уровня.


как это исправить?

  • Согласно приведенному выше объяснению, ваш проект не должен содержать двух или более операторов верхнего уровня. Чтобы исправить эту ошибку, вы можете удалить файл, который был добавлен позже.


6

Prasad Telkikar
7 Июн 2022 в 18:39

Понравилась статья? Поделить с друзьями:
  • Товарищ сталин произошла чудовищная ошибка откуда цитата
  • Только дураки учатся на своих ошибках бисмарк
  • Товарищ сталин произошла чудовищная ошибка откуда фраза
  • Только дурак учится на своих ошибках кто сказал
  • Товарищ сталин произошла чудовищная ошибка кто сказал