Comments
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.
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
Содержание
- Операторы верхнего уровня — программы без Main методов
- Только один файл верхнего уровня
- Другие точки входа отсутствуют
- Директивы using
- Глобальное пространство имен
- Пространства имен и определения типов
- await
- Код завершения для процесса
- Неявный метод точки входа
- Спецификация языка C#
- C# Только одна единица компиляции может иметь операторы верхнего уровня.
- 1 ответ
- Program.cs is hung up error CS8802 #7074
- Comments
- Footer
- Roslyn: Ошибки компилятора должны иметь лучшее сообщение об ошибке
- Все 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. Показов 3375. Ответов 1 Метки нет (Все метки)
Задали написание решение для задачки. Начинаю писать
в строке «int i=0» int выделяет как ошибку. Пишет
__________________
0 |
Администратор 15248 / 12287 / 4904 Регистрация: 17.03.2014 Сообщений: 24,884 Записей в блоге: 1 |
|
15.07.2022, 00:53 |
2 |
MrGray, вот ключевой момент
Только одна единица компиляции может содержать инструкции верхнего уровня. У вас в проекте есть еще один файл где вы писали код без явного объявления класса и метода Main — то что и называется «инструкции верхнего уровня». Закоментируйте их в другом файла или создайте новый проект для своей задачи.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
15.07.2022, 00:53 |
Помогаю со студенческими работами здесь В документах XML допускается только один элемент верхнего уровня "В документе XML (2, 118)…
<div class="price"> Ошибка при компиляции error: cannot convert ‘int (*)[5]’ to ‘double**’ for argument ‘1’ to ‘int INVERSE(double**, i Получить список, элементами которого будут являться только атомы верхнего уровня Map <int, CustomClass*> — ошибка при компиляции map<int, Letter*> 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
Интересные вопросы для изучения
В 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), а это невозможно.
Intro
From .NET 6, Program.cs is made with «Top-level statements».
In this time, I will try using «Top-level statements».
Environments
- .NET ver.6.0.101
Trying «Top-level statements» with default console project
First, I create a console project by «dotnet new console».
Program.cs
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
Enter fullscreen mode
Exit fullscreen mode
I decompile it by ilspy-vscode.
- GitHub — icsharpcode/ilspy-vscode
Program.cs
using System;
using System.Runtime.CompilerServices;
[CompilerGenerated]
internal class Program
{
private static void <Main>$(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
Enter fullscreen mode
Exit fullscreen mode
From the result, a class and a main method were generated.
I can get command-line arguments from «args».
Program.cs
foreach(var a in args)
{
Console.WriteLine($"arcuments: {a}");
}
Console.WriteLine("Hello, World!");
Enter fullscreen mode
Exit fullscreen mode
namespace ?
Can I put the class in namespaces? No.
Program.cs
namespace TopLevelStatementSample;
// Compiling error
Console.WriteLine("Hello, World!");
Enter fullscreen mode
Exit fullscreen mode
Program.cs
namespace TopLevelStatementSample
{
// Compiling error
Console.WriteLine("Hello, World!");
}
Enter fullscreen mode
Exit fullscreen mode
error CS0116: A namespace cannot directly contain members such as fields, methods or statements
Enter fullscreen mode
Exit fullscreen mode
Of course I also can’t put it into namespaces with curly braces.
Multiple files
Can I add one more files what is written by «Top-level statements»? No.
SampleClass.cs
// Compiling error
void Greet(string message)
{
Console.WriteLine("Hello sample class");
}
Enter fullscreen mode
Exit fullscreen mode
error CS8802: Only one compilation unit can have top-level statements.
Enter fullscreen mode
Exit fullscreen mode
Adding another main class
Can I add one more files what has static «Main» method? Yes.
SampleClass.cs
namespace TopLevelStatementSample;
public class SampleClass
{
public static void Main(string[] args)
{
Console.WriteLine("Hello sample class");
}
}
Enter fullscreen mode
Exit fullscreen mode
But I get a warning and «SampleClass» isn’t treated as the main class.
warning CS7022: The entry point of the program is global code; ignoring 'SampleClass.Main(string[])' entry point.
Enter fullscreen mode
Exit fullscreen mode
Result
Hello, World!
Enter fullscreen mode
Exit fullscreen mode
Add classes, methods, and variables
I can add classes into Program.cs.
But I only can write it at the bottom of the file.
classes
Program.cs
using TopLevelStatementSample;
class Sample1
{
// can't write classes at the top of the file.
}
// Compiling error
Console.WriteLine("Hello, World!");
class Sample2
{
// can't write classes at the middle of the file.
}
// Compiling error
SampleClass.Main(new string[0]);
var s3 = new Sample3();
class Sample3
{
// OK.
}
Enter fullscreen mode
Exit fullscreen mode
methods and variables
I can write methods and variables at everywhere in the file.
Program.cs
using TopLevelStatementSample;
void Greet(string message)
{
Console.WriteLine(message);
}
// OK
var message = "Hello message";
// OK
Greet(message);
SampleClass.Main(new string[0]);
Enter fullscreen mode
Exit fullscreen mode
Because they are treated as global, other classes also can look them.
But they can’t call any methods and variables in Program.cs.
SampleClass.cs
namespace TopLevelStatementSample;
public class SampleClass
{
public static void Main(string[] args)
{
// Compiling error
Greet("Hello sample class");
}
}
Enter fullscreen mode
Exit fullscreen mode
error CS8801: Cannot use local variable or local function 'Greet' declared in a top-level statement in this context.
Enter fullscreen mode
Exit fullscreen mode
Outro
Because «Top-level statements» are only for the entry point, they will only be created by «dotnet new» command.
I’m worried about implicit processing(ex. command-line arguments), but I think that the problem will disappear as you get used to it.
Resources
- Top-level statements — C# 9.0 feature specifications | Microsoft Docs
- エントリー ポイント — C# によるプログラミング入門 | ++C++; // 未確認飛行 C
Я только начал изучать С#, я создал консольное приложение С#. Чтобы понять концепции, я посмотрел видео о том, как настроить 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!
Структура проекта:
Я попробовал другой метод, нажав 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