Alasan Anda tidak diizinkan untuk mendefinisikan variabel dengan nama yang sama di kedua for-loop maupun di luar for-loop adalah karena variabel dalam lingkup luar valid dalam lingkup dalam. Berarti akan ada dua variabel 'i' di dalam for-loop jika ini diizinkan.
Lihat: Ruang Lingkup MSDN
Secara khusus:
Cakupan variabel lokal yang dideklarasikan dalam deklarasi variabel lokal (Bagian 8.5.1) adalah blok tempat deklarasi terjadi.
dan
Lingkup variabel lokal yang dideklarasikan dalam for-initializer dari statement for (Bagian 8.8.3) adalah for-initializer, for-condition, for-iterator, dan pernyataan yang terkandung dari statement for.
Dan juga: Deklarasi variabel lokal (Bagian 8.5.1 dari spesifikasi C #)
Secara khusus:
Cakupan variabel lokal yang dideklarasikan dalam deklarasi variabel lokal adalah blok tempat deklarasi terjadi. Adalah kesalahan untuk merujuk ke variabel lokal dalam posisi tekstual yang mendahului deklarator variabel lokal dari variabel lokal. Dalam lingkup variabel lokal, merupakan kesalahan waktu kompilasi untuk mendeklarasikan variabel lokal lain atau konstanta dengan nama yang sama.
(Penekanan milikku.)
Yang berarti bahwa ruang lingkup di i
dalam for-loop Anda, adalah untuk-loop. Sedangkan ruang lingkup bagian i
luar for-loop Anda adalah seluruh metode utama plus for-loop. Berarti Anda akan memiliki dua kejadian i
di dalam loop yang tidak valid sesuai dengan di atas.
Alasan mengapa Anda tidak diizinkan melakukannya int A = i;
adalah karena int i
hanya dicakup untuk digunakan dalam for
loop. Dengan demikian tidak lagi dapat diakses di luar for
loop.
Seperti yang Anda lihat, kedua masalah ini adalah hasil pelingkupan; masalah pertama ( int i = 4;
) akan menghasilkan dua i
variabel dalam for
lingkup loop. Sedangkan int A = i;
akan menghasilkan akses ke variabel yang berada di luar cakupan.
Apa yang bisa Anda lakukan adalah mendeklarasikan i
untuk mencakup seluruh metode, dan kemudian menggunakannya baik dalam metode maupun lingkup for-loop. Ini akan menghindari melanggar salah satu aturan.
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 :
Kompiler C # tentu saja dapat diubah untuk memungkinkan kode ini dikompilasi dengan cukup valid. Setelah semua ini valid:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Tetapi apakah itu benar-benar bermanfaat bagi keterbacaan dan pemeliharaan kode Anda untuk dapat menulis kode seperti:
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);
}
Pikirkan tentang potensi kesalahan di sini, apakah yang terakhir i
mencetak 0 atau 4? Sekarang ini adalah contoh yang sangat kecil, yang cukup mudah untuk diikuti dan dilacak, tetapi jelas jauh lebih mudah dirawat dan dibaca daripada menyatakan bagian luar i
dengan nama yang berbeda.
NB:
Harap perhatikan, aturan ruang lingkup C # berbeda dari aturan ruang lingkup C ++ . Dalam C + + variabel hanya dalam ruang lingkup dari mana mereka dideklarasikan sampai akhir blok. Yang akan membuat kode Anda konstruk yang valid di C ++.