编译错误 · error CS0128

局部变量"X"已在此作用域中定义

你在同一个作用域里声明了两次同名变量。C# 里声明意味着占用名字——第二次声明会撞车,哪怕类型完全一样。

亲眼看它发生

int score = 90;
Console.WriteLine(score);
int score = 85;     // CS0128: 'score' 在这个作用域里已经有人了

修法一:你想的是赋值,不是重新声明

最常见的形态:复制粘贴了一行,类型关键字还跟着。赋值用裸名字:

int score = 90;
Console.WriteLine(score);
score = 85;         // 没有 int——普通赋值
Console.WriteLine(score);

规则:类型关键字(int、string、var……)在一个作用域里对每个名字只出现一次。之后的每一次都是裸名字。

修法二:你想要的是两个不同的变量

int original = 90;
int revised = 85;               // 真的是两样东西:两个名字
Console.WriteLine($"original: {original}, revised: {revised}");

容易犯晕的地方:不同作用域里同名完全合法

块会创造作用域。循环体内声明的变量每一圈都是新的——方法参数也可以和字段重名:

for (int i = 0; i < 2; i++)
{
    int slot = i + 1;      // 每次迭代都是全新的 slot——不冲突
    Console.WriteLine(slot);
}

for (int i = 0; i < 2; i++)   // 第二个循环可以复用 i:不同作用域
{
    Console.WriteLine(i + 1);
}

class Dog
{
    public string Name = "field";

    public void Rename(string Name)     // 参数遮住字段——合法
    {
        Console.WriteLine("name param wins inside");
    }
}
new Dog().Rename("Rex");

CS0128 只管"一个作用域、一个名字只能声明一次"。嵌套作用域遮蔽外层名字是合法的——但不提倡,因为读者分不清看的是哪个变量。尽量用不同的名字。

常见问答

C# 里的 CS0128 是什么意思?

同一个局部变量名在同一个作用域里被声明了两次——多半是复制粘贴的行还带着类型关键字。第二行去掉类型就成了赋值,或者给一个变量改名。

不同作用域里两个变量能重名吗?

可以。独立循环各自声明 int i 完全合法;循环体每次迭代都是新作用域。CS0128 只管同一作用域内的重复声明。

排查清单