编译错误 · 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)——但改名几乎总是更好。

排查清单