Я читаю книгу Джозефа Альбахари О'Рейли под названием «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 в двух словах
Я попробовал использовать Может кто-нибудь объяснить, что это значит? Будем признательны за любую информацию о поведении этой области и ее последствиях!
Для начала хотелось бы просто узнать, что означает текст, процитированный из книги. Я знаю самые основы об областях видимости переменных, но не понимаю, что означает цитируемый абзац.
Не могли бы вы объяснить пространство и область объявления? Я прямо процитировал код и абзац из книги, поэтому не уверен в каких-либо двусмысленностях или неправильных смешениях.
Пара { }
заключает в себе новую «область действия», блок, в котором действительна определенная переменная.
Оба 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 правильно, но ошибка все еще внутри int x
Хорошо, большое спасибо. Не могли бы вы объяснить, почему это так? Почему область действия int x, объявленная вне скобок, противоречит той, которая объявлена внутри? Самое запутанное заключается в том, что мы не сможем сделать следующее (используйте x перед его объявлением): { Console.Write(x); } int x = 5;
Так почему же мы не можем объявить новый int x внутри скобок?
Если у вас разные x
на дочернем и родительском уровне, вы не можете использовать родительский-x на дочернем уровне. Я предполагаю, что для предотвращения этой проблемы компилятор просто запрещает дублирование объявления более высокого уровня.
Какой ответ вы ищете? Вопросы «Почему» совершенно неясны. Пожалуйста, конкретизируйте, что вы ищете.