La raison pour laquelle vous n'êtes pas autorisé à définir une variable avec le même nom à la fois dans la boucle for et en dehors de la boucle for est que les variables de la portée externe sont valides dans la portée interne. Cela signifie qu'il y aurait deux variables «i» dans la boucle for si cela était autorisé.
Voir: Étendues MSDN
Plus précisément:
La portée d'une variable locale déclarée dans une déclaration de variable locale (section 8.5.1) est le bloc dans lequel la déclaration se produit.
et
La portée d'une variable locale déclarée dans un for-initializer d'une instruction for (section 8.8.3) est le for-initializer, la for-condition, le for-iterator et l'instruction contenue de l'instruction for.
Et aussi: Déclarations de variables locales (Section 8.5.1 de la spécification C #)
Plus précisément:
La portée d'une variable locale déclarée dans une déclaration de variable locale est le bloc dans lequel la déclaration se produit. C'est une erreur de faire référence à une variable locale dans une position textuelle qui précède le déclarateur de variable locale de la variable locale. Dans le cadre d'une variable locale, déclarer une autre variable locale ou constante avec le même nom est une erreur de compilation.
(Soulignez le mien.)
Ce qui signifie que la portée de l' i
intérieur de votre boucle for est la boucle for. Alors que la portée de l' i
extérieur de votre boucle for est la méthode principale entière plus la boucle for. Cela signifie que vous auriez deux occurrences i
à l'intérieur de la boucle qui ne sont pas valides selon ce qui précède.
La raison pour laquelle vous n'êtes pas autorisé à le faire int A = i;
est que son utilisation int i
est uniquement réservée à la for
boucle. Il n'est donc plus accessible en dehors de la for
boucle.
Comme vous pouvez le voir, ces deux problèmes sont le résultat de la portée; le premier problème ( int i = 4;
) entraînerait deux i
variables dans la for
portée de la boucle. Alors que cela int A = i;
donnerait accès à une variable hors de portée.
Ce que vous pouvez faire à la place, c'est déclarer i
être étendu à la méthode entière, puis l'utiliser à la fois dans la méthode et dans la portée de la boucle for. Cela évitera d'enfreindre l'une ou l'autre règle.
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;
}
MODIFIER :
Le compilateur C # pourrait bien sûr être modifié pour permettre à ce code de se compiler de manière tout à fait valide. Après tout cela est valable:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Mais serait-il vraiment bénéfique pour la lisibilité et la maintenabilité de votre code de pouvoir écrire du code tel que:
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);
}
Pensez au potentiel d'erreur ici, est-ce que le dernier i
affiche 0 ou 4? Maintenant, c'est un tout petit exemple, qui est assez facile à suivre et à suivre, mais il est certainement beaucoup moins maintenable et lisible que d'avoir déclaré l'extérieur i
sous un nom différent.
NB:
Veuillez noter que les règles de portée de C # diffèrent des règles de portée de C ++ . En C ++, les variables sont uniquement dans la portée de l'endroit où elles sont déclarées jusqu'à la fin du bloc. Ce qui ferait de votre code une construction valide en C ++.