編譯錯誤 · error CS1001

應輸入識別符號

語法裡有個槽位只收名字,卻拿到了別的東西。報錯不總是告訴你是哪個名字——所以真本事是認出這些槽位。

親眼看它發生

int 5 = x;   // 變數名不能是數字

你會遇到的五個"名字槽位"

結構需要什麼名字錯的對的
變數宣告變數名int = 5;int x = 5;
類宣告類名class { }class Foo { }
方法宣告方法名void () { }void Run() { }
引數引數名void F(int) { }void F(int n) { }
new 表示式型別名var d = new ();var d = new Dog();

成因一:名字被刪掉了

string = "hello";   // 這個值該放進哪個變數?
string greeting = "hello";
Console.WriteLine(greeting);

成因二:關鍵字被當成名字

int class = 5;   // class 對編譯器已有含義

兩種修法——改名(更好),或者用 @ 轉義(合法但不好看):

int @class = 5;    // @ 表示"把它當普通名字"
Console.WriteLine(@class);

成因三:引數缺名字

void Greet(string)
{
    Console.WriteLine("hi");
}
void Greet(string name)
{
    Console.WriteLine("hi, " + name);
}

Greet("Ada");

成因四:泛型的型別引數是空的

var list = new List<>();   // 哪種 List?
var list = new List<int>();
Console.WriteLine(list.Count);

常見問答

CS1001 是什麼意思?

編譯器需要一個名字,卻找到了數字、運算子或錯位的關鍵字。在報錯位置給出合法識別符號。

能用關鍵字當名字嗎?

用 @ 可以(@class)——但改名幾乎總是更好。

排查清單