Error del compilador · error CS0128
Ya existe una variable local con el nombre 'X' en este ámbito
Declaraste el mismo nombre dos veces en el mismo ámbito. En C#, declarar reserva el nombre — una segunda declaración choca, aunque los tipos coincidan.
Míralo ocurrir
int score = 90;
Console.WriteLine(score);
int score = 85; // CS0128: 'score' ya está ocupado en este ámbito
Solución 1: querías ASIGNAR, no redeclarar
La forma más común: pegaste una línea que aún lleva su tipo. La asignación usa el nombre desnudo:
int score = 90;
Console.WriteLine(score);
score = 85; // sin 'int' — asignación simple
Console.WriteLine(score);
Regla: la palabra clave del tipo (int, string, var…) aparece UNA vez por ámbito y nombre. Todo uso posterior es solo el nombre.
Solución 2: querías dos variables distintas
int original = 90;
int revisado = 85; // realmente dos cosas: dos nombres
Console.WriteLine($"original: {original}, revisado: {revisado}");
La parte confusa: el mismo nombre en ámbitos DISTINTOS es legal
Los bloques crean ámbitos. Una variable declarada dentro del cuerpo de un bucle es nueva en cada iteración — y un parámetro de método puede compartir nombre con un campo:
for (int i = 0; i < 2; i++)
{
int slot = i + 1; // 'slot' nuevo en cada iteración — sin colisión
Console.WriteLine(slot);
}
for (int i = 0; i < 2; i++) // un segundo bucle SÍ puede reusar 'i': otro ámbito
{
Console.WriteLine(i + 1);
}
class Perro
{
public string Nombre = "campo";
public void Renombrar(string Nombre) // el parámetro oculta el campo — legal
{
Console.WriteLine("el parámetro gana dentro");
}
}
new Perro().Renombrar("Rex");
CS0128 solo trata de un ámbito, un nombre. Que ámbitos anidados oculten nombres externos es legal — pero mal visto, porque el lector pierde de vista qué variable está mirando. Prefiere nombres distintos.
Preguntas frecuentes
¿Qué significa CS0128 en C#?
El mismo nombre local declarado dos veces en el mismo ámbito — normalmente una línea copiada con su tipo. Quita el tipo en la segunda línea o renombra una variable.
¿Pueden dos variables compartir nombre en ámbitos distintos?
Sí. Dos bucles separados pueden declarar int i; el cuerpo del bucle es un ámbito nuevo en cada iteración. CS0128 solo salta en el mismo ámbito.
Lista de comprobación
- ¿Declarada dos veces en el mismo bloque? Quita el tipo en la segunda línea (asignación) o usa un nombre nuevo.
- Copiar y pegar es el sospechoso habitual — revisa la línea encima del error.
- El cuerpo de un bucle tiene ámbito nuevo por iteración; bucles separados pueden reusar el contador.
- Relacionados: CS0103 (nombre nunca declarado) y CS0165 (declarado pero nunca asignado).