La raison pour laquelle vous n'êtes pas autorisé à définir une variable avec le même nom dans la boucle for aswell comme à l'extérieur de la boucle for est parce que les variables dans l'avant-champ d'application sont valables à l'intérieur de la portée. Sens qu'il y aurait deux " i " variables à l'intérieur de la boucle for si cela était autorisé.
Voir: MSDN Étendues
Plus précisément:
La portée d'une variable locale déclarée dans un local-variable-déclaration
(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 initialiseur de un pour
déclaration (Section 8.8.3) est l'initialiseur, l'état,
l'itérateur, et le contenu de l'instruction de la déclaration.
Et aussi: Local des déclarations de variables (Section 8.5.1 de la spécification C#)
Plus précisément:
La portée d'une variable locale déclarée dans un local-variable-déclaration
est le bloc dans lequel la déclaration se produit. C'est une erreur de se référer
pour une variable locale dans une position textuelle qui précède le
local variable de demande de déclaration de la variable locale. Dans le cadre d'un
variable locale, c'est une erreur de compilation pour déclarer un autre local
variable ou constante avec le même nom.
(C'est moi qui souligne.)
Ce qui signifie que le champ d'application de l' i
à l'intérieur de votre boucle, la boucle for. Alors que le champ d'application de l' i
en dehors de ta boucle for est la totalité de la principale méthode de plus pour la boucle. Ce qui signifie que vous auriez deux occurrences de i
à l'intérieur de la boucle qui n'est pas valide conformément à la ci-dessus.
La raison pour laquelle vous n'êtes pas autorisé à le faire int A = i;
est parce qu' int i
n'est portée pour l'utilisation dans l' for
boucle. Ainsi, il n'est plus accessible de l'extérieur de l' for
boucle.
Comme vous pouvez le voir sur ces deux questions sont le résultat de la portée; la première question (int i = 4;
) entraînerait deux i
variables au sein de l' for
boucle portée. Alors qu' int A = i;
entraînerait l'accès à une variable qui est hors de portée.
Ce que vous pourriez faire à la place est de déclarer i
à être étendue à l'ensemble de la méthode, et ensuite l'utiliser dans la méthode ainsi que la boucle for de la portée. Cela permettra d'éviter de casser la règle.
public static void Main()
{
int i;
for (i = 0; i < 5; i++)
{
}
i = 4; // 'i' is only declared in the method scope now, no longer in the child scope -> valid.
int A = i; // 'i' is declared in the method's scope -> valid.
}
EDIT:
Le compilateur C# pourrait bien sûr être modifié pour permettre ce code pour compiler tout à fait valablement. Après tout, c'est valide:
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 votre code lisibilité et la maintenabilité d'être capable d'écrire le 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 à le potentiel pour des erreurs ici, la dernière i
imprimer 0 ou 4? Maintenant, c'est un tout petit exemple, celui qui est assez facile à suivre et piste, mais il est certainement beaucoup moins facile à gérer et lisible qu'après avoir déclaré que l'extérieur de la i
par un nom différent.
N. B:
Veuillez noter, C#'s règles de portée diffèrent de C++de règles de portée. En C++ les variables sont uniquement dans la portée de l'endroit où ils sont déclarés jusqu'à la fin du bloc. Ce qui rendrait votre code valide construire en C++.