2010-01-13 9 views
14

Me he estado preguntando por qué en C# no se permite el uso de un nombre de variable utilizado previamente en un ámbito hijo. De esta manera:Usando un nombre de variable usado en un ámbito hijo

if (true) 
{ 
    int i = 1; 
} 

int i = 2; 

Compilar el código anterior produce un error:

A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else

Y sin embargo, no se puede utilizar la variable definida en el ámbito secundario tampoco. El código anterior funciona bien en Java y no veo ninguna razón por la que no lo haga también en C#. Estoy seguro de que hay una buena razón, pero ¿qué es?

Respuesta

14

Es una opción de diseño hecha por los diseñadores de C#. Reduce la ambigüedad potencial.

Puede usarlo en uno de los dos lugares, dentro de si o afuera, pero solo puede definirlo en un solo lugar. De lo contrario, obtienes un error de compilación, como descubriste.

+0

De hecho, pensé que habría una razón "real", porque realmente no puedo entender por qué alguien haría una elección como esa. : D Pero veo el punto y es bueno saber por qué. – Carlos

+0

khilon: Realmente creo que el verdadero motivo es el que sugerí; ^) – Toad

+1

@Carlos fyi, el _real_ razón es que todas las declaraciones de variables se mueven a la parte superior de su alcance en algún momento (compilación o JIT). Por lo tanto, el orden de sus ámbitos en relación con sus declaraciones es poco importante, un conflicto de alcance hijo/ancestro siempre será un conflicto en tiempo de ejecución. El compilador lo rechaza por adelantado. – Gusdor

0

con toda probabilidad, cualquier variable creada en cualquiera de los ámbitos secundarios, se colocará en el fotograma de pila en el momento en que se ingresa el método.

De esta manera, un nombre similar en un ámbito secundario no puede coexistir con un nombre de variable en otro ámbito hijo.

Podrían haber trabajado en todo esto, por supuesto, si querían, así que supongo que en última instancia tiene que ver con el diseño, así .. esta manera hay menos posibilidades de error

1

Como dijo Adam Crossland, es un diseño elección: hecho para asegurarse de que usted (o, más probablemente, sus compañeros desarrolladores) no malinterprete el código.

A menudo se ven privadas de los miembros de instancia con el prefijo "m_" o "_" (por ejemplo. _myVar o m_myVar) para evitar confusiones ..

3

Algo me di cuenta de que no se señaló aquí. Esto se compilar:

for (int i = 0; i < 10; i++) 
{ 
    int a = i * 2; 
} 
for (int i = 0; i < 5; i++) 
{ 
    int b = i * 2; 
} 

En conjunto, estas decisiones de diseño parecen inconsistentes, o al menos restrictiva y extrañamente permisiva, respectivamente.

+0

"Por qué puedo usar la misma variable en los ámbitos hermanos" debe ser un comentario u otra pregunta. Realmente no es una respuesta, ya que esta publicación habla sobre ámbitos hermanos, a diferencia de la pregunta original (ámbitos de niños/padres). –

+0

Estoy de acuerdo. Intentaba aumentar el conocimiento señalando algo extraño sobre el alcance de C# relacionado con la pregunta original, pero desafortunadamente no pude publicarlo como un comentario ya que mi representante es muy bajo. – jeffmk

+0

Realmente no veo nada mal, ¿qué hay de malo en compilar? –

Cuestiones relacionadas