2009-05-14 21 views
8
... 
case 1: 
    string x = "SomeString"; 
    ... 
    break; 
case 2: 
    x = "SomeOtherString"; 
    ... 
    break; 
... 


C'è qualcosa che non sto capendo sull'istruzione switch in C#? Perché questo non dovrebbe essere un errore quando si usa il caso 2?
Modifica: questo codice funziona e non genera un errore.Inizializzazione della variabile dello switch C#: perché questo codice NON causa un errore del compilatore o un errore di runtime?

+0

è sufficiente inserire stringa x = "SomeOtherString"; quindi funzionerà. il, non è possibile utilizzare la variabile caso 1 nel caso in cui 2 si verificherà un errore fuori campo. –

+0

assicurati che il caso 2 richieda la modifica del codice. –

+0

@Syed: non è corretto. NESSUN errore si verifica con questo codice. –

risposta

16

Bisogna stare attenti a come si pensa circa la dichiarazione switch qui. C'è nessuna creazione di scope variabili in corso, infatti. Non lasciare il fatto che solo perché il codice all'interno dei casi viene rientrato, che risiede all'interno di un ambito figlio.

Quando viene compilato un blocco di interruttori, le etichette case vengono semplicemente convertite in etichette e l'istruzione goto appropriata viene eseguita all'inizio dell'istruzione switch in base all'espressione di commutazione. Infatti, è possibile utilizzare manualmente le istruzioni goto per creare situazioni "fall-through" (che C# supporta direttamente), come suggerito da the MSDN page.

goto case 1; 

Se specificamente voleva creare ambiti per ogni caso all'interno del blocco switch, si potrebbe fare quanto segue.

... 
case 1: 
{ 
    string x = "SomeString"; 
    ... 
    break; 
} 
case 2: 
{ 
    string x = "SomeOtherString"; 
    ... 
    break; 
} 
... 

Questo richiede di ridichiarare la variabile x (altrimenti si riceverà un errore di compilazione). Il metodo di scoping di ciascuna (o almeno di alcune) può essere abbastanza utile in determinate situazioni e lo si vedrà di sicuro nel codice di volta in volta.

+0

correggi il caso 2, quindi il tuo codice andrebbe bene. –

+0

@Syed: Sì, volevo sottolineare che per il blocco dell'intervallo con scope il compilatore * avrebbe * generato un errore. Ho chiarito che per dimostrare che è necessario ridefinire x in questo caso. – Noldorin

+0

@Noldorin: Un'altra cosa che voglio farti sapere, che il suo codice non ha ricevuto alcun errore nel caso 2. Questo perché ha già definito la stringa x prima di passare. Questo diventa globale e il caso 2 viene sempre eseguito senza errori. –

-2

spostare la dichiarazione stringa prima dell'istruzione

switch(value) 

. Quindi assegna x per ogni caso.

+0

Non sta chiedendo come farlo funzionare ... ma perché non c'è nessun errore del compilatore. – Inisheer

8

La documentazione relativa MSDN dice:

L'ambito di una variabile locale dichiarata in uno switch-blocco di un'istruzione switch (punto 8.7.2) è l'interruttore di blocco.

Inoltre, una domanda simile è stata fatta prima: Variable declaration in c# switch statement

+0

Grazie - Non ho trovato l'altra domanda. –

0

se si sta creando una variabile locale all'interno del caso, non è possibile utilizzarli fuori caso laterale.

... 
int opt ; 
switch(opt) 
{ 
case 1: 
{ 
    string x = "SomeString"; 
    ... 
} 
    break; 
case 2: 
{ 
    string x = "SomeOtherString"; 
    ... 
} 
    break; 
default: 
{ 
//your code 
} 
break; 
} 
... 
+0

se il caso contiene più istruzioni, quindi metti {le tue affermazioni multiple tra parentesi} e fuori pausa; –

+0

vedi il caso 2, non hai dichiarato la stringa X, ma nel mio caso 2, è correttamente defindato –

+0

chiunque dia il voto negativo, per favore specifica il motivo, quindi so cosa c'è di sbagliato nella mia risposta .. –

4

Nessun errore del compilatore poiché l'istruzione switch non crea un nuovo ambito per le variabili.

Se si dichiara una variabile all'interno di uno switch, la variabile si trova nello stesso scope del blocco di codice che circonda lo switch. Per modificare questo comportamento, è necessario aggiungere {}:

... 
case 1: 
    // Start a new variable scope 
    { 
     string x = "SomeString"; 
     ... 
    } 
    break; 
case 2: 
    { 
     x = "SomeOtherString"; 
     ... 
    } 
    break; 
... 

Ciò comporterà il reclamo del compilatore. Tuttavia, lo switch, da solo, non esegue internamente questo, quindi non c'è alcun errore nel codice.

1

Sembra che lo scope delle variabili sia all'interno dell'interruttore, non il caso, probabilmente perché i casi possono essere impilati. Notare che se si tenta di fare riferimento a x al di fuori dell'interruttore, fallirà.

Problemi correlati