Pourquoi le code suivant compile-t-il? Je m'attendrais à ce qu'il se plaint de foo code> 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?
4 Réponses :
Pourquoi le code suivant compile-t-il? P> blockQuote>
Parce que la langue est conçue dans une manière cérébrale dans cette zone particulière: ( p>
La portée d'une variable locale est le block em> dans lequel elle est déclarée, et elle est accessible à tout point lexiquement après la déclaration. P>
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 # ... p>
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. p>
Pour ne pas compiler, vous ne pouvez pas compiler avec les bretelles frisées, comme ceci: cette force que le var foo n'existe que dans cette portée particulière. P> P >
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; } }
Vous me battez à la même réponse!
peut vouloir voir Stackoverflow.com/Questtions/11199338/...