编译错误 · 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 只管同一作用域内的重复声明。