Вопрос о C # - PullRequest
       0

Вопрос о C #

8 голосов
/ 30 июля 2010

Рассмотрим следующий пример кода:

                         // line #
{                        // 1
                         // 2
    {                    // 3
        double test = 0; // 4
    }                    // 5
                         // 6  
    double test = 0;     // 7
}                        // 8 

Это приводит к ошибке

Локальная переменная с именем 'test' не может быть объявлена ​​в этой области, поскольку она даст другойзначение «тест», которое уже используется в «дочерней» области для обозначения чего-то другого

Но я не понимаю, почему?Внешняя тестовая переменная начинается со строки 7, а не со строки 2, так в чем же проблема объявить вторую переменную с именем test в строке 4 с областью видимости, заканчивающейся в строке 5?

Ответы [ 3 ]

10 голосов
/ 30 июля 2010

Переменные находятся в пределах блока , в котором они объявлены, не имеет значения, в какой строке они находятся.

Подробнее о областях действия в спецификации языка C #.

Из спецификации:

Область локальной переменной, объявленной в объявлении локальной переменной ( Раздел 8.5.1 ), - это блок, в котором происходит объявление.

И

Области могут быть вложенными, а внутренняя область действия может переопределять значение имени из внешней области. (Это, однако, не снимает ограничения, наложенного Разделом 3.3, что внутри вложенного блока невозможно объявить локальную переменную с тем же именем, что и у локальной переменной во включающем блоке.)

3 голосов
/ 30 июля 2010

Это часто задаваемый вопрос;см. также:

Область действия лямбда-переменной

C # схожу с ума, когда я объявляю переменные с тем же именем, что и в лямбде

Область видимости переменной C #: «x» не может быть объявлен в этой области видимости, поскольку это придает другое значение значению «x»

Путаница с областью действия переменной в C #

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

Например:

class C
{
    int x;
    void M()
    {
        int x;
    }
}

Совершенно законно. Обратите внимание, что область действия внешнего x перекрывает область действия внутреннего x. не незаконно иметь перекрывающиеся области с одним и тем же именем в обеих областях.

Это недопустимо:

class C
{
    int x;
    void M()
    {
        Console.WriteLine(x); // this.x
        {
            int x;
        }
    }
}

Опять же, обе области сперекрытие х совершенно законно.Недопустимо то, что в простом имени x используются две средние две разные переменные в одном и том же блоке - то есть во внешнем блоке M (), который содержит внутренний блокM.

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

Для более подробной информации читайте мои статьи на эту тему:

http://blogs.msdn.com/b/ericlippert/archive/tags/simple+names/

0 голосов
/ 30 июля 2010

+ 1, я согласен с вами, но спецификация написана не так.Это делает написание компилятора проще, я уверен.Кроме того, я думаю, что можно утверждать, что в любом случае предпочтительно не делать этого, чтобы облегчить понимание кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...