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

You’re mixing top level statements and non-TLS. TLS essentially allows you to do away with all the namespace/class/static main and just write a C# program as if it were the contents of the Main method: learn.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/

In essence, this means program structure is a bit wonky because you start with some TLS, then go more regular style, then back to TLS; switching away from a TLS structure (I would suggest you just get used to the namespace/class/main fluff; it’s still heavily used, and to some extent it’s a reasonable intro to curly braces and scope). It looks like:

namespace X{
    class Program {
        public static void Main (string[] args) {
    
            int English;
            int Science;
            int AverageCalc;
        
            Console.WriteLine("Write your math grades");
        
            Math = Convert.ToInt32(Console.ReadLine());
        
            Console.WriteLine("Write your english grades");
        
            English = Convert.ToInt32(Console.ReadLine());
        
            Console.WriteLine("Write your science grades");
        
            Science = Convert.ToInt32(Console.ReadLine());
        
            AverageCalc = (Math+English+Science/3);
    
    
            if (AverageCalc > 80)
            {
              Console.WriteLine("You passed with A mark!");
            }
            else if (AverageCalc < 80)
            {
              Console.WriteLine("You passed with B mark!");
            }
            else if (AverageCalc < 65)
            {
              Console.WriteLine("You passed with C mark!");
            }
            else if (AverageCalc < 60)
            {
              Console.WriteLine("You passed with D mark!");
            }
            else if (AverageCalc < 55)
            {
              Console.WriteLine("You got lower than D mark, try better next time.");
            }

            Console.WriteLine("Press ENTER to exit (hah)");
            Console.ReadLine();
        }
    }
}

A simple program like this is conducted entirely within the scope of the Main method’s curly braces. Later, when you start getting into actual object oriented things and having more than one student whose grades you’re tracking, you’ll move stuff out of the static Main, and write inside other curly brace blocks, but this will do for now.

You’ve forgotten to declare a variable for math — I’ll leave that as an exercise for you to sort out. Also, when variables are declared inside a method (Main is a method) you should name them using camelCase rather than PascalCase. It might not seem important now, but it’s convention and following it helps later on when code gets more complex. PascalCase is typically used for public methods, properties, casses and namespaes, and camel for private or local.

In short, your variables should be called english, science, and averageCalc

При попытке вызвать класс выдает ошибку:

CS8803: Top-level statements must precede namespace and type declarations. Do not know what this means.

код:

class App
{
    public static void Greeting()
    {
        Console.WriteLine("Hello");
    }
}

App.Greeting();


  • Вопрос задан

  • 815 просмотров

Ну тебе же человеческим языком сказали, что твои statement-ы должны идти ДО объявлений классов.
Тоесть вот так:

App.Greeting();
class App
{
    public static void Greeting()
    {
        Console.WriteLine("Hello");
    }
}

Пригласить эксперта


  • Показать ещё
    Загружается…

20 сент. 2023, в 03:07

500 руб./за проект

20 сент. 2023, в 02:34

40000 руб./за проект

20 сент. 2023, в 00:43

300 руб./в час

Минуточку внимания

You’re mixing top level statements and non-TLS. TLS essentially allows you to do away with all the namespace/class/static main and just write a C# program as if it were the contents of the Main method: learn.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/

In essence, this means program structure is a bit wonky because you start with some TLS, then go more regular style, then back to TLS; switching away from a TLS structure (I would suggest you just get used to the namespace/class/main fluff; it’s still heavily used, and to some extent it’s a reasonable intro to curly braces and scope). It looks like:

namespace X{
    class Program {
        public static void Main (string[] args) {
    
            int English;
            int Science;
            int AverageCalc;
        
            Console.WriteLine("Write your math grades");
        
            Math = Convert.ToInt32(Console.ReadLine());
        
            Console.WriteLine("Write your english grades");
        
            English = Convert.ToInt32(Console.ReadLine());
        
            Console.WriteLine("Write your science grades");
        
            Science = Convert.ToInt32(Console.ReadLine());
        
            AverageCalc = (Math+English+Science/3);
    
    
            if (AverageCalc > 80)
            {
              Console.WriteLine("You passed with A mark!");
            }
            else if (AverageCalc < 80)
            {
              Console.WriteLine("You passed with B mark!");
            }
            else if (AverageCalc < 65)
            {
              Console.WriteLine("You passed with C mark!");
            }
            else if (AverageCalc < 60)
            {
              Console.WriteLine("You passed with D mark!");
            }
            else if (AverageCalc < 55)
            {
              Console.WriteLine("You got lower than D mark, try better next time.");
            }

            Console.WriteLine("Press ENTER to exit (hah)");
            Console.ReadLine();
        }
    }
}

A simple program like this is conducted entirely within the scope of the Main method’s curly braces. Later, when you start getting into actual object oriented things and having more than one student whose grades you’re tracking, you’ll move stuff out of the static Main, and write inside other curly brace blocks, but this will do for now.

You’ve forgotten to declare a variable for math — I’ll leave that as an exercise for you to sort out. Also, when variables are declared inside a method (Main is a method) you should name them using camelCase rather than PascalCase. It might not seem important now, but it’s convention and following it helps later on when code gets more complex. PascalCase is typically used for public methods, properties, casses and namespaes, and camel for private or local.

In short, your variables should be called english, science, and averageCalc

Студворк — интернет-сервис помощи студентам

Такой вопрос: почему когда я создаю экземпляр класса после создания класса, то мне пишет, что «инструкции верхнего уровня должны предшествовать объявлениям пространств имён и типов». Если же я сначала пишу код, в котором создаю экземпляры и переменные, то всё нормально работает. Если что, вот код пример нерабочего кода, где создание экземпляра и объявление переменных следует за созданием класса

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Mike
{
    private int age;
    private string name;
    private int power;
    public Mike(int getage, string getname, int getpower)
    {
        age = getage;
        name = getname;
        power = getpower;
 
    }
 
    public void SayHi()
    {
        Console.WriteLine("Hi, my name is {0}. I am {1} years old. My power is {2}.", name, age, power);
    }
}
 
int myage = Convert.ToInt32(Console.ReadLine());
int mypower = Convert.ToInt32(Console.ReadLine());
string myname = Console.ReadLine();
Mike michaels = new Mike(myage, myname, mypower);
michaels.SayHi();

Problem encountered on https://dotnet.microsoft.com/en-us/learn/aspnet/hello-world-tutorial/modify
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.

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

$ dotnet watch
dotnet watch 🔥 Hot reload enabled. For a list of supported edits, see https://aka.ms/dotnet/hot-reload.
💡 Press «Ctrl + R» to restart.
dotnet watch 🔧 Building…
Определение проектов для восстановления…
Все проекты обновлены для восстановления.
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(2,8): error CS1003: Синтаксическая ошибка, требуется «,» [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(3,1): error CS1646: После спецификатора verbatim (@) требуется ключевое слово, идентификатор или строка. [C:UsersalexeMyWebAppMyWebAppMyWebA
pp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(4,13): error CS1002: Требуется «;». [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(4,14): error CS1001: Требуется идентификатор. [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(4,23): error CS1525: Недопустимый термин «=» в выражении [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(5,1): error CS1022: Требуется определение типа или пространства имен, либо признак конца файла. [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj
]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(5,2): error CS1525: Недопустимый термин «<» в выражении [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(7,6): error CS1002: Требуется «;». [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(7,11): error CS1001: Требуется идентификатор. [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(7,11): error CS1514: Требуется «{» [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(7,11): error CS1513: Требуется «}» [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(7,11): error CS8803: Инструкции верхнего уровня должны предшествовать объявлениям пространств имен и типов. [C:UsersalexeMyWebAppMyWebAppMyW
ebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(7,11): error CS1525: Недопустимый термин «=» в выражении [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(7,26): error CS1525: Недопустимый термин «<» в выражении [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(8,14): error CS1002: Требуется «;». [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(8,14): error CS1022: Требуется определение типа или пространства имен, либо признак конца файла. [C:UsersalexeMyWebAppMyWebAppMyWebApp.cspro
j]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(8,23): error CS1525: Недопустимый термин «/» в выражении [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(8,27): error CS1525: Недопустимый термин «<» в выражении [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(9,12): error CS1002: Требуется «;». [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(9,20): error CS1003: Синтаксическая ошибка, требуется «,» [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
C:UsersalexeMyWebAppMyWebAppPagesIndex.cshtml.cs(10,7): error CS1002: Требуется «;». [C:UsersalexeMyWebAppMyWebAppMyWebApp.csproj]
dotnet watch ⏳ Waiting for a file to change before restarting dotnet…

C# logoИнструкции верхнего уровня (Top-Level Statement) позволяют отказаться от некоторых формальностей при написании приложений и сделать код проще. Возможно, это не очень будет заметно при написании сложных приложений, но может хорошо сэкономить время при проведении исследований, создании небольших утилит и прототипов.

Минимальная платформа с полной поддержкой: нет ограничений.

Так обычно выглядит точка входа в консольное приложение:

namespace Prototype
{
    public static class Program
    {
        public static int Main(string[] args)
        {
            bool success = DoSomeJob();
            return success ? 1 : -1;
        }
    }
}

В данном случае C# 9 позволяет отказаться от таких шаблонных деталей как namespace, class Program, метод Main(…) и сразу начать писать код точки входа.

var result = DoSomeJob();
return  result ? 1 : -1;

Такой код и называется инструкциями верхнего уровня.

Возможности

В инструкциях верхнего уровня можно:

  • обращаться к переменной string[] args, представляющей собой массив аргументов переданных через командную строку.
  • возвращать целочисленное (int) значение.
  • вызывать асинхронные методы.
  • объявлять локальные методы.
  • объявлять свои пространства имен и классы, но только после кода инструкций верхнего уровня.

При сборке проекта компилятор в глобальном пространстве имен (global namespace) автоматически создаст класс Program c одним из четырех вариантов метода Main(…), в зависимости от написанного кода:

  • void Main(string[] args)
  • int Main(string[] args)
  • Task Main(string[] args)
  • Task<int> Main(string[] args)

Стоит отметить, что классы, объявленные в файле с инструкциями верхнего уровня будут обычными, а не внутренними классами Program, независимо от наличия собственного пространства имен. 

Рассмотрим описанные возможности на следующем примере:

using System;
using System.Threading.Tasks;
using DemoApp.Reader;

var reader = new FileReader();
string content = await reader.Read(GetFileName());
Console.WriteLine(content);

return content.Length;

string GetFileName() => args[0];

namespace DemoApp.Reader
{
    public class FileReader
    {
        public async Task Read(string fileName)
            => await System.IO.File.ReadAllTextAsync(fileName);
    }
}

Результат декомпиляции собранного проекта будет выглядеть следующим образом:

using System;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using DemoApp.Reader;

[CompilerGenerated]
internal class Program
{
    private static async Task<int> <Main>$(string[] args)
    {
        FileReader reader = new FileReader();
        string content = await reader.Read(GetFileName());
        Console.WriteLine(content);

        return content.Length;

        string GetFileName()
        {
            return args[0];
        }
    }
}

Отдельно, в пространстве имен DemoApp.Reader, можно найти класс FileReader. Его код, по сути, ничем не отличается от его объявления выше.

Ограничения

  • В проекте может быть только один файл с инструкциями верхнего уровня.
  • В проекте может быть только или объялена классическая точка входа (метод Main(…)) или указаны инструкции верхнего уровня.

Особенности

Несмотря на то, что класс Program автоматически генерируемый, на этапе разработки он доступен в приложении как и любой другой класс.

Кроме того, его можно расширить, добавив свои методы. Для этого необходимо самостоятельно объявить internal partial class Program. Соответственно, добавленные статические методы, будут также доступны в коде инструкций верхнего уровня.

Перепишем пример выше, заменив локальный метод GetFileName() на публичный статический:

using System;
using System.Threading.Tasks;
using DemoApp.Reader;

var reader = new FileReader();
string content = await reader.Read(GetFileName(args));
Console.WriteLine(content);

return content.Length;

internal partial class Program
{
    public static string GetFileName(string[] args)
        => args[0];
}

namespace DemoApp.Reader
{
    public class FileReader
    {
        public async Task Read(string fileName)
            => await System.IO.File.ReadAllTextAsync(fileName);
    }
}

Результат декомпиляции будет следующий:

// Program
using System;
using System.Threading.Tasks;
using DemoApp.Reader;

internal class Program
{
    private static async Task<int> <Main>$(string[] args)
    {
        FileReader reader = new FileReader();
        string content = await reader.Read(GetFileName(args));
        Console.WriteLine(content);

        return content.Length;
    }

    public static string GetFileName(string[] args)
    {
        return args[0];
    }
}

Итак, я не долго программировал, поэтому у меня нет такого опыта, недавно я столкнулся с проблемой на replit.com, когда консоль распечатывала:

error CS8803: Top-level statements must precede namespace and type declarations.
using System;

Может кто подскажет проблему? Вот мой код, кому интересно:

int English;
int Science;
int AverageCalc;

AverageCalc = Convert.ToInt32(Console.ReadLine());

class Program {
  public static void Main (string[] args) {
    Console.WriteLine("Write your math grades");

      Math = Convert.ToInt32(Console.ReadLine());

      Console.WriteLine("Write your english grades");

      English = Convert.ToInt32(Console.ReadLine());

      Console.WriteLine("Write your science grades");

      Science = Convert.ToInt32(Console.ReadLine());

      AverageCalc = (Math+English+Science/3);
  }
}

if (AverageCalc > 80)
{
  Console.WriteLine("You passed with A mark!");
}
else if (AverageCalc < 80)
{
  Console.WriteLine("You passed with B mark!");
}
else if (AverageCalc < 65)
{
  Console.WriteLine("You passed with C mark!");
}
else if (AverageCalc < 60)
{
  Console.WriteLine("You passed with D mark!");
}
else if (AverageCalc < 55)
{
  Console.WriteLine("You got lower than D mark, try better next time.");
}

3 ответа

Как упоминал @Caius в своем ответе, вы исправляете оператор верхнего уровня и классический способ как в своем коде.

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

class Program
{
    public static void Main (string[] args) 
    {

И закрытие } класса Program и метода Main.

Пример взят из документации .

Ниже коды одинаковые.

using System;

namespace Application
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

TLS

Console.WriteLine("Hello, World!");


3

vivek nuna
17 Окт 2021 в 14:56

Вы смешиваете операторы верхнего уровня и не-TLS. По сути, TLS позволяет вам избавиться от всех namespace/class/static main и просто написать программу на C#, как если бы она была содержимым метода Main: docs.microsoft.com/en-us/dotnet/csharp/whats-new/ учебники/

По сути, это означает, что структура программы немного шаткая, потому что вы начинаете с некоторого TLS, затем переходите к более обычному стилю, а затем снова к TLS; отказ от структуры TLS (я бы посоветовал вам просто привыкнуть к пространству имен/классу/основному пуху; он все еще широко используется, и в некоторой степени это разумное введение в фигурные скобки и область видимости). Это выглядит как:

namespace X{
    class Program {
        public static void Main (string[] args) {
    
            int English;
            int Science;
            int AverageCalc;
        
            Console.WriteLine("Write your math grades");
        
            Math = Convert.ToInt32(Console.ReadLine());
        
            Console.WriteLine("Write your english grades");
        
            English = Convert.ToInt32(Console.ReadLine());
        
            Console.WriteLine("Write your science grades");
        
            Science = Convert.ToInt32(Console.ReadLine());
        
            AverageCalc = (Math+English+Science/3);
    
    
            if (AverageCalc > 80)
            {
              Console.WriteLine("You passed with A mark!");
            }
            else if (AverageCalc < 80)
            {
              Console.WriteLine("You passed with B mark!");
            }
            else if (AverageCalc < 65)
            {
              Console.WriteLine("You passed with C mark!");
            }
            else if (AverageCalc < 60)
            {
              Console.WriteLine("You passed with D mark!");
            }
            else if (AverageCalc < 55)
            {
              Console.WriteLine("You got lower than D mark, try better next time.");
            }

            Console.WriteLine("Press ENTER to exit (hah)");
            Console.ReadLine();
        }
    }
}

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

Вы забыли объявить переменную для math — я оставлю это вам в качестве упражнения, чтобы разобраться. Кроме того, когда переменные объявляются внутри метода (Main — это метод), вы должны именовать их, используя camelCase, а не PascalCase. Сейчас это может показаться неважным, но это условность, и следование ей поможет позже, когда код станет более сложным. PascalCase обычно используется для общедоступных методов, свойств, классов и имён, а camel — для частных или локальных.

Короче говоря, ваши переменные должны называться english, science и averageCalc.


3

Bellrampion
18 Авг 2022 в 00:39

C# требует, чтобы весь код находился внутри метода, а все методы — внутри класса.

Код

int English;
int Science;
int AverageCalc;

AverageCalc = Convert.ToInt32(Console.ReadLine());

Просто есть и компилятор не знает что с ним делать. Компилятор ожидает метод Main(), который вызывается первым, и оттуда должен вызываться весь остальной код.

Помните, что C# — это не язык сценариев, в котором операторы вычисляются один за другим сверху вниз.


0

John Alexiou
18 Авг 2022 в 00:47

Вы смешиваете операторы верхнего уровня и не-TLS. TLS по сути позволяет избавиться от всех
namespace/class/static main и просто напишите программу на C#, как если бы это было содержимое метода Main: docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/

По сути, это означает, что структура программы немного нестабильна, потому что вы начинаете с некоторого TLS, затем переходите к более обычному стилю, а затем снова к TLS; переход от структуры TLS (я бы посоветовал вам просто привыкнуть к пространству имен / классу / главному бреду; он все еще активно используется, и в некоторой степени это разумное введение в фигурные скобки и область видимости), это выглядит так:

      namespace X{
    class Program {
        public static void Main (string[] args) {
    
            int English;
            int Science;
            int AverageCalc;
        
            Console.WriteLine("Write your math grades");
        
            Math = Convert.ToInt32(Console.ReadLine());
        
            Console.WriteLine("Write your english grades");
        
            English = Convert.ToInt32(Console.ReadLine());
        
            Console.WriteLine("Write your science grades");
        
            Science = Convert.ToInt32(Console.ReadLine());
        
            AverageCalc = (Math+English+Science/3);
    
    
            if (AverageCalc > 80)
            {
              Console.WriteLine("You passed with A mark!");
            }
            else if (AverageCalc < 80)
            {
              Console.WriteLine("You passed with B mark!");
            }
            else if (AverageCalc < 65)
            {
              Console.WriteLine("You passed with C mark!");
            }
            else if (AverageCalc < 60)
            {
              Console.WriteLine("You passed with D mark!");
            }
            else if (AverageCalc < 55)
            {
              Console.WriteLine("You got lower than D mark, try better next time.");
            }

            Console.WriteLine("Press ENTER to exit (hah)");
            Console.ReadLine();
        }
    }
}

Такая простая программа выполняется полностью в рамках фигурных скобок метода. Позже, когда вы начнете заниматься реальными объектно-ориентированными вещами и иметь более одного ученика, чьи оценки вы отслеживаете и т. Д., Вы переместите материал из статический Main и писать внутри других блоков фигурных скобок, но пока этого достаточно.

Вы забыли объявить переменную для
math— Я оставлю это вам в качестве упражнения. Кроме того, когда переменные объявляются внутри метода (
Main это метод) вы должны назвать их, используя
camelCase скорее, чем
PascalCase. Сейчас это может показаться неважным, но это соглашение и его следование помогает позже, когда код станет более сложным.PascalCase обычно используется для общедоступных методов, свойств, классов и имен, а camel — для частных или локальных.

Короче говоря, ваши переменные должны называться
english,
science, а также
averageCalc

Это тоже интересно:

  • Инструкцией принято называть документ ветеринария
  • Инструкцией о порядке обращения с информацией составляющей коммерческую тайну предусматривается сдо
  • Инсталляция santeri инструкция по сборке
  • Инсектицид тарантул инструкция по применению
  • Инсектицид мовенто энерджи инструкция по применению

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии