编译错误 · 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<>()。