64 votes

Pourquoi est-ce que C# permettent de déclarations après un cas, mais pas avant?

Pourquoi est-ce que C# permettent cela:

var s = "Nice";
switch (s)
{
    case "HI":
        break;
    const string x = "Nice";
    case x:
        Console.Write("Y");
        break;
}

Mais pas ce:

var s = "Nice";
switch (s)
{
    const string x = "Nice";
    case x:
        Console.Write("Y");
        break;
}

119voto

Konrad Rudolph Points 231505

Parce que ton indentation est trompeuse, le premier code est en réalité:

var s = "Nice";
switch (s)
{
    case "HI":
        break;
        const string x = "Nice";
    case x:
        Console.Write("Y");
        break;
}

C'est, x est déclarée à l'intérieur d'un case déclaration (même si après un break), où il est valide. Cependant, directement à l'intérieur d'un switch déclaration il est invalide – la seule valable déclarations il y a case et default.

En outre, const des déclarations sont évalués au moment de la compilation, alors x est défini même si il y a un break déclaration avant.

Toutefois, notez que le Mono compilateur C# ne peut pas se compiler ce code, il se plaint que "le nom ‘x"n'existe pas dans le champ d'application actuel" donc Mono semble pour mettre en œuvre plus de contrôles que l' .NET compilateur. Cependant, je ne trouve pas de règles dans le C# norme qui interdit l'utilisation de l' const déclaration, donc je suppose que l' .NET est un compilateur droit et le Mono compilateur est mal.

7voto

peer Points 11386

Parce que le langage de spécification ne permet pas un const directement dans votre commutateur (seul cas et par défaut sont autorisés):

switch (expression)
{
   case constant-expression:
      statement
      jump-statement
   [default:
      statement
      jump-statement]
}

Où:

expression: Intégrante de chaîne ou expression de type.
statement: Intégré à l'énoncé(s) sera exécutée que si le contrôle est transféré au cas ou la valeur par défaut.
jump-statement: D'une instruction de saut qui transfère le contrôle de l'affaire du corps.
constant-expression: Le contrôle est transféré à un cas spécifique en fonction de la valeur de cette expression.

Dans le premier cas, la const est une partie de votre cas de la logique. Le const va ne fonctionne que parce qu'il est ré-compile-time et non pas au moment de l'exécution.

1voto

G. Stoynev Points 1733

... parce qu' switch cette

jump_to_the_label_matchig(s)
{
   label1:
      ...
      done_quit_this;
   label2:
      ...
      done_quit_this;
   d'oh:
      ...
      done_quit_this;
}

et non pas de ce

now_jump_to_the_label_matchig(s)
{

   le'mme_wander_around_doing_things_that_could_have_been_done_before_me;

   label1:
      ...
      done_quit_this;
   label2:
      ...

Je te parie que si c'était permis, que vous pouvez trouver des gens prêts à faire tout leur programmation :-)

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