@vovkaooo1

Как работает правило области объявления в c#?

Имеется недопонимание как компилятор определяет можно ли объявить в данной области переменную или нет.
Первый листинг
static void Main(string[] args)
        {
            int some = 400;
            if (some > 100) 
            {
                int ansome = some - 100;
                Console.WriteLine(ansome);
            }
                int ansome = 10000;
                Console.WriteLine(ansome);
        }

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

Второй листинг
static void Main(string[] args)
        { 
            int some = 400;
            if (some > 100) 
            {
                int ansome = some - 100;
                Console.WriteLine(ansome);
            }
            {
                int ansome = 10000;
                Console.WriteLine(ansome);
            }
        }

В данном случае компилятор не выдаст ошибки. И вроде бы все логично, но я не понимаю какой смысл. В книги, в которой приводится данный пример говорится, что это правило было введено, чтобы программисты не допускали ошибку, которые работают в условиях, где требуется переменные объявлять в начале кода. Но если я буду переносить переменную в начало кода, то все остальные инициализации сразу станут ошибочными. И вот тут возникает вопрос, а чего я не понимаю? И какие нюансы еще скрыты и где о них можно прочесть.
  • Вопрос задан
  • 148 просмотров
Пригласить эксперта
Ответы на вопрос 2
sarapinit
@sarapinit Куратор тега C#
Точу водой камень
https://docs.microsoft.com/en-us/dotnet/csharp/lan...

The lifetime of a local variable is the portion of program execution during which storage is guaranteed to be reserved for it. This lifetime extends at least from entry into the block, for_statement, switch_statement, using_statement, foreach_statement, or specific_catch_clause with which it is associated, until execution of that block, for_statement, switch_statement, using_statement, foreach_statement, or specific_catch_clause ends in any way. (Entering an enclosed block or calling a method suspends, but does not end, execution of the current block, for_statement, switch_statement, using_statement, foreach_statement, or specific_catch_clause.) If the local variable is captured by an anonymous function (Captured outer variables), its lifetime extends at least until the delegate or expression tree created from the anonymous function, along with any other objects that come to reference the captured variable, are eligible for garbage collection.


Судя по всему компилятор рассматривает просто области видимости, вне зависимости от положения переменной в блоке. Кажется что тут нет простого ответа и надо лезть в код компилятора, либо просто смириться со спецификацией
Ответ написан
Комментировать
@krka92
Смысл в том, что мы объявляем (и иногда сразу инициализируем) переменную один раз и используем в текущем и вложенных блоках.
static void Main(string[] args)
        {
            int some = 400;
            int ansome;
            if (some > 100) 
            {
                ansome = some - 100;
                Console.WriteLine(ansome);
            }
                ansome = 10000;
                Console.WriteLine(ansome);
        }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы