50 votes

Pourquoi un nom de variable en double ne peut-il pas être déclaré dans une portée locale imbriquée?

Basé sur cette dernière question, je ne comprends pas la réponse fournie. Semble que vous devriez être en mesure de faire quelque chose comme cela, car leurs champs d'application ne se chevauchent pas

static void Main()
{
  {
    int i;
  }
  int i;
}

Ce code ne peut pas compiler avec l'erreur suivante:

Une variable locale nommée " je "ne peut pas être déclaré dans ce champ d'application, car il donnerait un sens différent de "je", qui est déjà utilisé dans un 'enfant' étendue pour désigner quelque chose d'autre

38voto

Jon Skeet Points 692016

Je ne pense pas que les réponses jusqu'à présent ont bien reçu l'essentiel de la ligne à partir de la spécification.

À partir de la section 8.5.1:

La portée d'une variable locale déclarée dans un local-variable-de la déclaration est le bloc dans lequel la déclaration se produit. C'est une erreur de se référer à une variable locale dans une position textuelle qui précède le local de la variable de demande de déclaration de la variable locale. À l'intérieur de la portée d'une variable locale, c'est une erreur de compilation de déclarer une autre variable locale ou constante avec le même nom.

(C'est moi qui souligne.)

En d'autres termes, le champ d'application de la "plus tard" variable comprend la partie du bloc avant de la déclaration, c'est à dire qu'il comprend le "intérieure" bloc contenant le "plus haut" à la variable.

Vous ne pouvez pas reporter à plus tard variable dans un lieu plus tôt que sa déclaration, mais il est toujours dans la portée.

8voto

Teoman Soygul Points 17544

"Le champ d'application de local constant ou variable s'étend jusqu'à la fin du bloc courant. Vous ne pouvez pas déclarer une autre variable locale de même nom dans le bloc en cours ou en tout les blocs imbriqués." C# 3.0 en un Mot, http://www.amazon.com/3-0-Nutshell-Desktop-Reference-OReilly/dp/0596527578/

"La déclaration de variable locale de l'espace d'un bloc comprend tous les blocs imbriqués. Ainsi, à l'intérieur d'un bloc imbriqué il n'est pas possible de déclarer une variable locale avec le même nom qu'une variable locale à un bloc enfermant." Variable Étendues, MSDN http://msdn.microsoft.com/en-us/library/aa691107%28v=vs.71%29.aspx

Sur une note de côté, c'est tout le contraire que de JavaScript et F# règles de portée.

6voto

Sean U Points 4476

À partir du langage C# spec:

La déclaration de variable locale de l'espace d'un bloc comprend tous les blocs imbriqués. Ainsi, à l'intérieur d'un bloc imbriqué il n'est pas possible de déclarer une variable locale avec le même nom qu'une variable locale à un bloc enfermant.

Essentiellement, il n'est pas permis parce que, en C#, leurs champs d'application en réalité ne se chevauchent.

edit: Juste pour préciser, C#'s portée est résolu au niveau du bloc, et non pas ligne par ligne. Alors, s'il est vrai que l'on ne peut pas faire référence à une variable dans le code qui vient avant sa déclaration, il est également vrai que son champ d'application s'étend tout le chemin du retour au début du bloc.

3voto

Henk Holterman Points 153608

Cela a été une règle en C # depuis la première version.

Permettre le chevauchement des domaines ne ferait que créer de la confusion (des programmeurs, pas du compilateur).

Donc, cela a été interdit exprès.

2voto

Gabe Points 49718

Ce n'est pas une question de chevauchement des champs d'application. En C#, un simple nom ne peut signifier plus d'une chose à l'intérieur d'un bloc où elle est déclarée. Dans votre exemple, le nom de l' i signifie deux choses différentes dans le même bloc externe.

En d'autres termes, vous devriez être en mesure de déplacer une déclaration de variable autour à n'importe quel endroit dans le bloc où elle a été déclarée sans causer étendues à se chevaucher. Puisque la modification de votre exemple:

static void Main()
{
    int i;
    {
        int i;
    }
}

serait la cause de la portée des divers i variables à se chevaucher, votre exemple est illégal.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X