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

排查清單