Причина, через яку вам не дозволяється визначати однакову змінну як у циклі for, так і поза циклом for, полягає в тому, що змінні у зовнішній області є дійсними у внутрішній області. Це означає, що у фор-циклі будуть дві змінні 'i', якщо це було дозволено.
Див .: Області MSDN
Конкретно:
Область локальної змінної, оголошеної в локальній змінній-декларації (Розділ 8.5.1), є блоком, в якому відбувається оголошення.
і
Область локальної змінної, оголошеної в for-ініціалізаторі оператора for (Розділ 8.8.3), є for-ініціалізатором, for-умовою, for-ітератором та вміщеним оператором for для оператора.
А також: локальні оголошення змінної (Розділ 8.5.1 специфікації C #)
Конкретно:
Область локальної змінної, оголошеної в локальній змінній-декларації, є блоком, в якому відбувається декларація. Помилка посилання на локальну змінну в текстовому положенні, що передує локальній змінній-декларатору локальної змінної.У межах локальної змінної - це помилка часу компіляції при оголошенні іншої локальної змінної або константи з тим самим іменем.
(Наголос мій.)
Що означає, що сфера дії i
всередині вашого for-loop - це цикл for. Тоді як сфера i
зовнішньої частини вашої for-петлі є головним плюсом методу for-loop. Значить, у вас є два входження i
в цикл, який є недійсним відповідно до вищезазначеного.
Причина, через яку вам не дозволяють, int A = i;
це тому, що int i
вона використовується лише для використання в for
циклі. Таким чином, він більше не доступний поза for
петлею.
Як ви бачите, обидва ці питання є результатом обстеження; перший випуск ( int i = 4;
) призведе до двох i
змінних у межах for
циклу. В той час як int A = i;
це призведе до доступу до змінної, яка виходить за межі сфери.
Що ви можете зробити замість цього - оголосити, що він i
має бути приписаний до всього методу, а потім використовувати його як у методі, так і в області for-loop. Це дозволить уникнути порушення будь-якого правила.
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;
}
Редагувати :
Зрозуміло, що компілятор 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
іншою назвою.
Примітка:
Зверніть увагу, що правила розміщення C # відрізняються від правил розміщення C ++ . В C ++ змінні знаходяться лише в області застосування, де вони оголошені до кінця блоку. Що зробить ваш код дійсною конструкцією в C ++.