6
votes

Pourquoi les variables sont-elles déclarées dans une déclaration de cas dans la portée des autres cas?

Pourquoi le code suivant compile-t-il? Je m'attendrais à ce qu'il se plaint de foo ne pas être déclaré dans la deuxième branche de cas. Le compilateur gère-t-il la déclaration de telle sorte qu'il soit dans la portée de tous les cas? XXX


1 commentaires

peut vouloir voir Stackoverflow.com/Questtions/11199338/...


4 Réponses :


9
votes

Pourquoi le code suivant compile-t-il?

Parce que la langue est conçue dans une manière cérébrale dans cette zone particulière: (

La portée d'une variable locale est le block dans lequel elle est déclarée, et elle est accessible à tout point lexiquement après la déclaration.

Non, je ne concevrais pas la langue de cette façon non plus. Je ne suis pas un fan de la conception du commutateur en C # ...


0 commentaires

1
votes

dans les variables C # sont scopées au niveau du bloc. Comme le bloc suit la déclaration de commutation, FOO est effectivement une portée dans les deux cas.


0 commentaires

3
votes

Pour ne pas compiler, vous ne pouvez pas compiler avec les bretelles frisées, comme ceci: xxx

cette force que le var foo n'existe que dans cette portée particulière.


0 commentaires

8
votes

Qu'est-ce que @Jonskeet dit est correct: un "bloc" dans le sens C / C ++ / C # n'est pas la même chose que "cas" au sens logique. Mais il n'a pas mentionné la "meilleure pratique" pour la correction du problème: si vous souhaitez déclarer une variable à l'intérieur d'une case d'un énoncé de commutateur, c'est une bonne pratique d'envelopper l'ensemble du "cas" logique dans un bloc. De cette façon, le "cas" logique et la "périmètre" reconnu par le compilateur seront identiques et identiques.

public static void Main()
{
    var x = 2;
    switch (x)
    {
        case 1: {  // notice these braces I added
            var foo = "one";
            Console.Out.WriteLine(foo);
            break;
        }
        case 2:
            foo = "two"; // hooray! foo is no longer in scope here
            Console.Out.WriteLine(foo);
            break;
    }
}


1 commentaires

Vous me battez à la même réponse!