59 votes

Les déclarations de variables suivantes si les déclarations

Un problème est apparu sur un autre forum et je savais comment résoudre le problème, mais il a révélé une caractéristique de l'compilateur particulière pour moi. La personne qui a été l'obtention de l'erreur "Embedded déclaration ne peut pas être une déclaration ou un rapport marqué" parce qu'ils avaient une déclaration d'une variable suivant une instruction if sans crochets. Ce n'était pas leur intention, mais ils avaient commenté la ligne de code qui suit immédiatement l'instruction if, qui a fait de la déclaration de la variable, de facto, la ligne de code à exécuter. De toute façon, c'est le fond, ce qui m'amène à cela.

Le code suivant est illégal

if (true)
    int i = 7;

Toutefois, si vous enroulez qui, entre parenthèses, tout est légal.

if (true)
{
    int i = 7;
}

Aucun morceau de code est utile. Pourtant, le second est OK. Précisément ce qui est l'explication de ce comportement?

80voto

Tomas Petricek Points 118959

La spécification du langage C# fait la distinction entre trois types d'énoncés (voir le chapitre 8 pour plus de détails). En général, vous pouvez avoir ces déclarations:

  • étiquetés-déclaration - je suppose que c'est pour l'ancienne, goto déclaration
  • déclaration-déclaration - qui serait une déclaration de variable
  • embedded-déclaration - qui comprend à peu près toutes les déclarations restantes

Dans l' if déclaration, le corps doit être incorporé-déclaration, ce qui explique pourquoi la première version du code qui ne fonctionne pas. Voici la syntaxe d' if de la spécification (section 8.7.1):

si ( boolean expression ) intégré-déclaration
si ( boolean expression ) intégré-déclaration d'autre embedded-déclaration

Une déclaration de variable est de déclaration-déclaration, de sorte qu'il ne peut pas apparaître dans le corps. Si vous vous joignez à la déclaration entre parenthèses, vous obtiendrez un bloc, ce qui est un intégré de déclaration (et il peut donc apparaître dans cette position).

27voto

Zach Johnson Points 12062

Lorsque vous n'avez pas inclure les crochets, il exécute la ligne suivante comme s'il était entouré par des crochets. Comme il n'a pas beaucoup de sens pour déclarer une variable dans la ligne (vous ne seriez pas capable de l'utiliser), le compilateur C# ne permettra pas cela pour vous empêcher de vous accidentellement le faire sans le savoir (ce qui pourrait introduire des bogues).

Voici une partie de Eric Lippert a à dire sur le compilateur C# sur cette SORTE de réponse à propos de la résolution de noms:

...C# n'est pas un "deviner ce que l'utilisateur a signifié" de la langue...le compilateur par la conception se plaint bruyamment si le meilleur match est quelque chose qui ne fonctionne pas

10voto

JaredPar Points 333733

Tous les compilateurs vous permettra de compiler le code qui est inutile ou extrêmement faible utilisation. Il y a tout simplement trop d'égards qu'un développeur peut utiliser la langue pour créer des constructions à aucun usage. Avoir le compilateur attraper tous les d'eux est tout simplement trop beaucoup d'efforts et généralement pas la peine.

Le deuxième cas est appelée directement dans la spécification du langage C# au début de la section 8.0

L'exemple entraîne une erreur de compilation car une instruction if nécessite un intégré à l'instruction plutôt que d'une déclaration pour ses si la branche. Si ce code a été autorisée, alors la variable i serait déclarée, mais elle ne pourrait jamais être utilisé. Notez, cependant, que, en plaçant j'ai de la déclaration dans un bloc, l'exemple est valide.

Exemple De Code

void F(bool b) {
    if (b)
        int i = 44;
}

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