編譯錯誤 · 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)——但改名幾乎總是更好。
排查清單
- 定位槽位:宣告、類、方法、引數、還是
new。 - 名字整個缺了?補一個。
- 是關鍵字?改名,或用
@轉義。 - 泛型引數缺了?寫
new List<int>()而不是new List<>()。