2012-01-19 11 views
5

Duplicar posibles:
Child Scope & CS0136
C# Variable Scoping¿Cómo funciona Local-Alcance El trabajo en C#

Aunque he estado usando C# desde hace bastante tiempo, acabo de tropezado con este error .

Si tengo el siguiente:

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

me sale un error que 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.

Y si hago esto:

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

consigo un error que dice: The name 'x' does not exist in the current context.

Puedo entender tener uno u otro, pero ¿por qué? ¿ambos de estos errores existen? ¿Hay alguna forma de evitar la primera opción? Me resulta muy molesto.

Gracias.

+0

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

+0

@Comments: Sí, lo siento. Supongo que debería haber hecho una búsqueda primero ...: -/ – Eric

+0

@Eric por si realmente estás buscando causar a ti mismo, y a otros, mucho dolor y sufrimiento, aquí hay algunos ejemplos de personajes tipo x que son identificadores válidos en C#: 'int Ҳ, ҳ, א, ẋ, ẍ;' estoy seguro de que nadie le agradecerá más adelante si elige mezclar estos caracteres en su código fuente. :) (En caso de que no esté claro para cualquiera que lea esto ... por favor no use caracteres exóticos como estos para que pueda tener diferentes variables con nombres similares) –

Respuesta

6

Ambos errores existen para evitar cometer errores o hacer que sus colegas deseen matarlo.

La primera falla porque es confuso tener dos variables locales con el mismo nombre, ambas en el ámbito a la vez.

La segunda falla porque el alcance de la variable es la instrucción if, e intenta acceder a ella fuera de ese ámbito.

Si desea una única variable que se puede utilizar tanto dentro como fuera del bloque, sólo tiene que declarar que antes el bloque:

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

Si usted quiere realmente dos variables independientes para estar en alcance al mismo tiempo (dentro del bloque), luego deles diferentes nombres, evitando confusiones posteriores.

EDITAR: Usted puede declarar múltiples variables locales con el mismo nombre en un único método, pero tienen que tener ámbitos separados. Por ejemplo:

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 no tienden a usar esta habilidad muy a menudo - al menos no con diferentes tipos - cuando las variables tienen nombres significativos y los métodos son cortos. Pero es absolutamente legítimo, y ciertamente puede ser útil a veces.

+0

@Jon: dispuesto a arriesgar la posibilidad de la muerte, ¿es posible tener, por ejemplo, un 'int' y un' doble' llamado 'x' en la misma función? – Eric

+1

@Eric: Sí, pero no en el mismo ámbito. Agregará un ejemplo. –

3

En el primer caso, el problema es que su int x fuera del bloque { } tiene un alcance global que incluye el contexto dentro de { }; por lo tanto, está volviendo a declarar una variable con el mismo nombre.

En el segundo caso; x no existe, ya que solo está definido dentro de { }

Cuestiones relacionadas