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

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();

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

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();


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

    23 авг. 2022

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

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

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

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


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

13 июл. 2023, в 22:06

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

13 июл. 2023, в 21:38

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

13 июл. 2023, в 20:28

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

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

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];
    }
}

Понравилась статья? Поделить с друзьями:
  • Инструкции бухгалтерского учета бюджетных учреждений 157н
  • Инструкции select входящие в функцию не могут возвратить данные клиенту
  • Инструкции joi на русском языке
  • Инструкции avx age of empires 4
  • Инструкцией по организационно штатной работе в федеральных судах общей юрисдикции