Las respuestas dadas hasta ahora son muy confusas. El análisis correcto del problema comienza por leyendo el mensaje de error. El mensaje de error que le está diciendo lo que es realmente malo:
"Una variable local llamada 'matriz' no se pueden declarar en este ámbito, ya que daría un significado diferente a 'matriz', que ya se utiliza en un ' alcance 'niño para denotar algo más.
leído que cuidadosamente.Le está diciendo con precisión qué regla de C# se está violando, es decir, , que no tiene permiso para usar el mismo nombre para referirse a dos cosas diferentes en el mismo ámbito. (En realidad, el mensaje de error es un poco incorrecto; debe decir "espacio de declaración de variable local" donde dice "alcance", pero es bastante prolijo).
Esta regla está documentada en la especificación C# 4.0, sección 7.6. 2.1: Nombres simples, significado invariable en bloques.
(se también ilegal tener dos variables locales del mismo nombre en la superposición de espacios de declaración. El compilador puede informando que el error así, sino que informa del error más general en este caso.)
¿No son estas variables en diferentes ámbitos, por lo que no podría acceder a la primera matriz desde fuera de la instrucción if de todos modos?
Sí. Esa declaración es verdadero pero irrelevante. El error aquí es que el mismo nombre simple se ha usado para referirse a dos cosas diferentes en el mismo espacio de declaración de variable local.
Considere este escenario:
class C
{
int x;
void M()
{
x = 10; // means "this.x"
for(whatever)
{
int x = whatever;
}
}
}
mismo trato. El error aquí es que el nombre simple "x" se usó en el espacio de declaración externo para referirse a this.x, y se usó en el espacio de declaración interno para significar "variable local". Usando el mismo nombre simple para referirse a dos cosas diferentes en el mismo espacio de declaración - recuerde, el espacio interno de declaración es parte del exterior - es ambos confundiendo y peligroso, y por lo tanto es ilegal.
Es confuso por razones obvias; uno tiene una expectativa razonable de que un nombre signifique lo mismo en todas partes a lo largo del espacio de declaración en el que se usa por primera vez. Es peligroso porque los pequeños cambios de código son propensos a cambiar el significado:
class C
{
int x;
void M()
{
int x;
x = 10; // no longer means "this.x"
for(whatever)
{
x = whatever;
}
}
}
Si los espacios de declaración en el que los nombres simples se utilizaron por primera vez se no se solapan entonces es legal para los nombres simples para referirse a diferentes cosas:
class C
{
int x;
void M()
{
{
x = 10; // means "this.x"
}
for(whatever)
{
int x = whatever; // Legal; now the
}
}
}
Para obtener más información, y una divertida historia acerca de los alimentos fritos, ver
http://blogs.msdn.com/b/ericlippert/archive/tags/simple+names/
Incluso si la pregunta es elegible, esto evita que cometa errores por descuido. –
aquí [http://bytes.com/topic/c-sharp/answers/659303-already-used-child-scope-denote-something-else] puede encontrar una explicación de Jon Skeet. Y aquí http://stackoverflow.com/questions/296755/child-scope-cs0136 también por Jon Skeet. –
@Tim: Sí, pero uno necesita hacer nuevos nombres de variables innecesarios, cada vez, se debe usar algo similar, solo para satisfacer al compilador. IMO si el código es claro, esto no causaría ningún problema. Puedo ver lo que significaba cada matriz sin hacer: matrixTemporary, matrixReal, etc. –