Причина, по которой вам не разрешено определять переменную с одинаковым именем как в цикле for, так и вне цикла for, заключается в том, что переменные во внешней области действия допустимы во внутренней области. Это означает, что в цикле for будут две переменные 'i', если это будет разрешено.
См .: Области MSDN
В частности:
Область локальной переменной, объявленной в объявлении локальной переменной
(Раздел 8.5.1) - это блок, в котором происходит объявление.
и
Область действия локальной переменной, объявленной в for-инициализаторе for
оператор (раздел 8.8.3) является инициализатором for, условием for,
for-iterator и содержащийся оператор for.
А также: Объявления локальных переменных (Раздел 8.5.1 спецификации C #)
В частности:
Область локальной переменной, объявленной в объявлении локальной переменной
блок, в котором происходит объявление. Ссылка на ошибку
к локальной переменной в текстовой позиции, которая предшествует
локальная переменная-декларатор локальной переменной. В рамках
локальная переменная, это ошибка времени компиляции, чтобы объявить другую локальную
переменная или константа с тем же именем.
(Акцент мой.)
Это означает, что область действия i
внутри вашего цикла for является циклом for. Принимая во внимание, что область действия i
вне вашего цикла for - это весь основной метод plus for-loop. Это означает, что у вас будет два вхождения i
внутри цикла, что недопустимо в соответствии с приведенным выше.
Причина, по которой вам не разрешено делать int A = i;
, заключается в том, что int i
ограничивается только для использования в цикле for
. Таким образом, он больше не доступен вне цикла for
.
Как вы можете видеть, обе эти проблемы являются результатом определения области; первая проблема (int i = 4;
) привела бы к двум i
переменным в пределах цикла for
. Принимая во внимание, что int A = i;
приведет к доступу к переменной, которая находится вне области видимости.
Вместо этого вы можете объявить i
как область действия всего метода, а затем использовать его как в методе, так и в области действия цикла for. Это позволит избежать нарушения любого из правил.
public static void Main()
{
int i;
for (i = 0; i < 5; i++)
{
}
// 'i' is only declared in the method scope now,
// no longer in the child scope -> valid.
i = 4;
// 'i' is declared in the method's scope -> valid.
int A = i;
}
EDIT
Компилятор C #, конечно, можно изменить, чтобы этот код компилировался вполне корректно. После всего этого действует:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Но было бы действительно полезно для вашего кода удобочитаемость и удобство сопровождения, чтобы иметь возможность писать такой код, как:
public static void Main()
{
int i = 4;
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Console.WriteLine(i);
}
Подумайте о возможной ошибке здесь, последние i
выводят 0 или 4? Теперь это очень маленький пример, за которым довольно легко следить и отслеживать, но он определенно гораздо менее удобен в обслуживании и читаемости, чем объявление внешнего i
под другим именем.
N.B:
Обратите внимание, что правила области видимости в C # отличаются от Правила области видимости в C ++ . В C ++ переменные находятся только в области видимости от того, где они объявлены, до конца блока. Что сделает ваш код допустимой конструкцией в C ++.