2012-09-13 12 views
6

Dlaczego następujący kod się kompiluje? Spodziewałbym się, że będzie narzekać na to, że foo nie zostanie zadeklarowany w drugim oddziale. Czy kompilator obsługuje deklarację taką, że jest w zasięgu dla wszystkich przypadków?Dlaczego zmienne są zadeklarowane w jednym przypadku w zakresie dla innych przypadków?

using System; 

namespace Scratch 
{ 
    class Scratch 
    { 
     public static void Main() 
     { 
      var x = 2; 
      switch (x) 
      { 
       case 1: 
        var foo = "one"; 
        Console.Out.WriteLine(foo); 
        break; 
       case 2: 
        foo = "two"; // is foo in scope here? 
        Console.Out.WriteLine(foo); 
        break; 
      } 
     } 
    } 
} 
+0

chcieć zobaczyć http://stackoverflow.com/questions/11199338/using-a-switch-statement-to-set-the-value-of-one-particular-variable-only – nawfal

Odpowiedz

8

Co powiedział @JonSkeet jest poprawny: "blok" w sensie C/C++/C# to nie to samo, co "przypadek" w sensie logicznym. Ale nie wspomniał o "najlepszej praktyce", która rozwiązuje problem: jeśli chcesz zadeklarować zmienną w jednym przypadku instrukcji switch, dobrze jest zawrzeć cały logiczny "case" w bloku. W ten sposób logiczny "przypadek" i rzeczywisty "zasięg" rozpoznany przez kompilator będą jednym i tym samym.

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; 
    } 
} 
+0

Pobiłeś do tej samej odpowiedzi! – ColinCren

8

Dlaczego następujący kod skompilować?

Ponieważ język został zaprojektowany w stanie śmierci mózgowej sposób w tym konkretnym obszarze :(

Zakres zmiennej lokalnej jest blokw którym jest zadeklarowana i jest dostępny w każdym punkcie leksykalnie po deklaracji.

nie, nie będę projektować język ten sposób obaj. nie jestem fanem konstrukcji przełącznika w C# ...

1

w C# zmiennych scoped na poziomie bloku. Ponieważ blok jest zgodny ze statusem przełącznika t, foo jest rzeczywiście w zakresie w obu przypadkach.

3

Aby nie kompilacji można zakresu z klamrami, takich jak ten:

using System; 

namespace Scratch 
{ 
    class Scratch 
    { 
     public static void Main() 
    { 
     var x = 2; 
     switch (x) 
     { 
      case 1: 
      { 
       var foo = "one"; 
       Console.Out.WriteLine(foo); 
       break; 
      } 
      case 2: 
      { 
       foo = "two"; // is foo in scope here? 
       Console.Out.WriteLine(foo); 
       break; 
      } 
     } 
    } 
} 

Wymusza to, że foo var tylko istnieje w danym zakresie.

Powiązane problemy