2012-01-19 8 views
5

Eventuali duplicati:
Child Scope & CS0136
C# Variable ScopingCome funziona Local-Scope Work in C#

Anche se sto usando C# per un bel po 'di tempo, ho solo inciampato su questo errore .

Se ho il seguente:

if(true) 
{ 
    int x = 0; 
} 
int x = 0; 

ottengo un errore che dice: A local variable named 'x' cannot be declared in this scope because it would give a different meaning to 'x', which is already used in a child scope to denote something else.

E se faccio questo:

if(true) 
{ 
    int x = 0; 
} 
x = 0; 

ottengo un errore che dice: The name 'x' does not exist in the current context.

Posso capire di avere uno o l'altro, ma perché do sono presenti entrambi gli errori? C'è un modo per aggirare la prima opzione? Lo trovo molto fastidioso.

Grazie.

+0

vedere http://stackoverflow.com/a/296780/870604 – ken2k

+0

@Comments: Sì, mi dispiace. Suppongo che avrei dovuto fare qualche ricerca prima ...: -/ – Eric

+0

@Eric nel caso tu stia davvero cercando di provocare te stesso e gli altri, un sacco di dolore e sofferenza, ecco alcuni esempi di personaggi simili a X che sono identificatori validi in C#: 'int Ҳ, ҳ, א, ẋ, ẍ;' Sono sicuro che nessuno ti ringrazierà più tardi se scegli di mescolare questi caratteri nel codice sorgente. :) (Nel caso in cui non sia chiaro a chiunque stia leggendo questo ... per favore, per favore, non usare caratteri esotici come questi solo per poter avere variabili diverse con nomi dall'aspetto simile) –

risposta

6

Entrambi questi errori esistono per impedirti di commettere errori o per indurre i tuoi colleghi a volerti uccidere.

Il primo non riesce perché è confusionario avere due variabili locali con nome identico nello scope contemporaneamente.

Il secondo non riesce perché l'ambito della variabile è l'istruzione if e si sta tentando di accedervi al di fuori di tale ambito.

Se si desidera una singola variabile che può essere utilizzato sia all'interno che all'esterno del blocco, basta dichiararlo prima del blocco:

int x; 
if (true) 
{ 
    x = 0; 
} 
x = 0; 

Se si vuole realmente due variabili separate per essere in portata allo stesso tempo (all'interno del blocco), quindi dare loro nomi diversi, evitando così la confusione successiva.

MODIFICA: È possibile dichiarare più variabili locali con lo stesso nome in un unico metodo, ma devono avere ambiti separati. Per esempio:

public void Foo(IEnumerable<string> values) 
{ 
    double sum = 0; 
    foreach (string x in values) 
    { 
     int z = x.Length; 
     sum += z; 
    } 

    foreach (string x in values) 
    { 
     double z = double.Parse(x); 
     sum += z; 
    } 
} 

Personalmente non tendono di utilizzare questa capacità molto spesso - almeno non con diversi tipi - quando le variabili hanno nomi significativi e metodi sono brevi. Ma è assolutamente legittimo e può essere utile a volte.

+0

@Jon: Disposto a rischiare la possibilità della morte, è possibile avere, diciamo, sia un 'int' che un' double' chiamato 'x' nella stessa funzione? – Eric

+1

@Eric: Sì, ma non nello stesso ambito. Aggiungerà un esempio. –

3

Nel primo caso, il problema è che il int x esterno al blocco { } ha un ambito globale che racchiude il contesto all'interno di { }; quindi stai ri-dichiarando una variabile con lo stesso nome.

Nel secondo caso; x non esiste poiché è definito solo all'interno di { }