編譯錯誤 · 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 只管同一作用域內的重複宣告。