Почему C# позволяет расширять область действия переменной по всему блоку независимо от порядка объявления? (Ссылка на книгу: «C#10 в двух словах», Джозеф Альбахари)

Я читаю книгу Джозефа Альбахари О'Рейли под названием «C#10 в двух словах». При описании локальных переменных в книге говорится следующее:

int x; 

{ 
    int y; 
    int x; // Error - x already defined 
} 

{ 
    int y; // OK - y not in scope 
} 

Console.Write (y); // Error - y is out of scope 

«Область действия переменной распространяется в обоих направлениях по всему ее блоку кода. Это означает, что если мы переместим исходное объявление x в этом примере в конец метода, мы получим ту же ошибку. В отличие от C++, это несколько странно, учитывая, что недопустимо ссылаться на переменную или константу до ее объявления». - Глава 2 C#10 в двух словах

Я попробовал использовать Может кто-нибудь объяснить, что это значит? Будем признательны за любую информацию о поведении этой области и ее последствиях!

Какой ответ вы ищете? Вопросы «Почему» совершенно неясны. Пожалуйста, конкретизируйте, что вы ищете.

Sweeper 21.08.2024 10:20

Для начала хотелось бы просто узнать, что означает текст, процитированный из книги. Я знаю самые основы об областях видимости переменных, но не понимаю, что означает цитируемый абзац.

aim 21.08.2024 10:24

Не могли бы вы объяснить пространство и область объявления? Я прямо процитировал код и абзац из книги, поэтому не уверен в каких-либо двусмысленностях или неправильных смешениях.

aim 21.08.2024 10:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пара { } заключает в себе новую «область действия», блок, в котором действительна определенная переменная.

Оба y объявлены в родственных областях. Они не будут мешать друг другу. Также они не будут доступны в родительской области — поэтому Console.WriteLine завершается с ошибкой.

Однако один x определен в «родительской» области, а другой — в дочерней. Это дочернее объявление конфликтует с объявлением, объявленным в родительской области. И это будет даже в том случае, если вы переместите «родителя» int x в конец блока, даже если тогда использовать его раньше будет недопустимо.

{
    int x; // Error - x already defined 
}

int x;

«И это будет даже в том случае, если вы переместите «родительский» int x в конец блока, даже если тогда использовать его раньше будет невозможно». Вы имеете в виду следующее утверждение под приведенным выше утверждением? { int y; int x; }int x; // Error - x already defined (Я думаю, что нет, но я не могу придумать другую интерпретацию.) Если это так, разве это не должно быть допустимо, поскольку область действия первого блока кода заканчивается, а второй int x выходит за пределы области действия первого интервал х?

aim 21.08.2024 10:35

@aim правильно, но ошибка все еще внутри int x

Hans Kesting 21.08.2024 10:44

Хорошо, большое спасибо. Не могли бы вы объяснить, почему это так? Почему область действия int x, объявленная вне скобок, противоречит той, которая объявлена ​​внутри? Самое запутанное заключается в том, что мы не сможем сделать следующее (используйте x перед его объявлением): { Console.Write(x); } int x = 5; Так почему же мы не можем объявить новый int x внутри скобок?

aim 21.08.2024 10:50

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

Hans Kesting 21.08.2024 11:33

Другие вопросы по теме