Почему я не могу объявить переменную с тем же именем, которое уже объявлено, но новая переменная выходит за рамки другой переменной - PullRequest
2 голосов
/ 12 марта 2012
private void Abc()
{
    string first="";
    ArrayList result = new ArrayList();
    ArrayList secResult = new ArrayList();
    foreach (string second in result)
    {
        if (first != null)
        {
            foreach (string third in secResult)
            {
                string target;
            }
        }

        string target;//Here I cannot decalre it. And if I don't declare it and
        //want to use it then also I cannot use it. And if it is in if condition like
        //the code commented below, then there is no any complier error.
        //if (first != null)
        //{
        //    string target;
        //}
    }
}

Я не могу понять: почему я не могу объявить переменную вне цикла foreach, так как компилятор выдает ошибку, что переменная уже объявлена. Область действия foreach (и, следовательно, переменной target) находится там, где я объявляю эту новую переменную.

Ответы [ 2 ]

9 голосов
/ 12 марта 2012

Область действия локальной переменной простирается вплоть до начала блока, в котором она объявлена.Таким образом, область действия вашей второй декларации как фактически всего внешнего цикла foreach.Из спецификации C # 4, раздел 3.7:

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

и в разделе 8.5.1:

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

Так что, хотя вторая переменная не была объявлена ​​в точкетам, где возникает первая переменная, она все еще находится в области видимости - поэтому два объявления между ними нарушают 8.5.1.

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

2 голосов
/ 12 марта 2012

Это потому, что второе объявление предназначено для всей области метода области действия первого цикла foreach, который включает в себя второй цикл foreach, содержащийся в методе.так что вам нужно ограничить область действия другой строки, используя фигурные скобкиметоды.я бы попросил вас еще раз просмотреть код и посмотреть, можно ли его восстановить.

...