Miért van az, hogy C#-ban az i = 20 mindkét változatban fordítási hibát eredményez?
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}
int i = 20;
}
---------------------------------------------------------
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}
i = 20;
}
A második eset tiszta: nincs deklarálva i a scopeban.
Az elsőnél meg a hibaüzenet segíthet. Nincs előttem C# fordító, de gyanítom valami olyasmit mond, hogy unused variable.
Első (int i = 20):
A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else
Második (i = 20):
The name 'i' does not exist in the current context
Bár az első logikus lenne, a gond ezzel lenne elméletben:
int i = 20;
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}
Mivel i-t felüldefiniálnád a ciklusban.
Viszont a compilert egyszerűen úgy írták meg, és azt a szabályt hozták hogy az számít, hogy melyik scopeban van a változó, azaz itt a Main scopeban deklarált változót egy gyerek scopejában újradeklarálsz, még akkor is ha ez utána van.
Defnícó erre vonatkozóan:
"For each occurrence of a given identifier as a simple-name in an expression or declarator, within the local variable declaration space of that occurrence, every other occurrence of the same identifier as a simple-name in an expression or declarator must refer to the same entity. This rule ensures that the meaning of a name is always the same within a given block, switch block, for-, foreach- or using-statement, or anonymous function."
Tehát hiába van a for után a deklaráció, ez ugyanúgy a Main scopehoz tartozik, mintha a for előtt lenne, ezért dobja a hibát.
Persze lehetne okosabb a fordító, de egyszerűen nem akartak ezzel bajlódni gondolom.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!