编译错误 · error CS1002

; expected(缺少分号)

语句没有在编译器期望的地方结束。这是 C# 最常见的错误,它最有用的一条性质:真正的错误通常在报错行的上一行。

亲眼看它发生

int x = 5
Console.WriteLine(x);

仔细读错误:它指向第 2 行——但漏掉的分号在第 1 行末尾。编译器要等到看到 Console 出现在本该是 ;、运算符或 } 的位置,才发现问题。所以排查 CS1002 的口诀:

到报错的那一行,然后看它上一行的末尾。

int x = 5;
Console.WriteLine(x);

到底什么东西要分号?

语句以 ; 结尾;块——带 { … } 的东西——不要。整条规则就这一句:

int total = 0;                    // 声明语句 → ;

for (int i = 1; i <= 3; i++)      // for(...) 本身 → 不要
{
    total += i;                   // 块内 → 每条语句都要 ;
}                                 // 闭花括号 → 不要

if (total > 2)                    // 不要
{
    total++;                      // 要 ;
}                                 // 不要

Console.WriteLine(total);         // 要 ;

经典触发场景

1. return 到一半

int Add(int a, int b)
{
    return a + b      // return 值后面忘了 ;
}

Console.WriteLine(Add(1, 2));

2. 方法调用独占一行

Console.WriteLine("working…")
Console.WriteLine("never reached");

3. 连锁反应——一个分号产生五个错误

没有分号,编译器会把第一行和第二行粘成一个巨大的胡话表达式,然后在它 first 迷路的地方报错。修第一个错误、重新编译,其余的常常自动蒸发。新手从最后一个错误开始修;编译器从上往下读,你也应该。

表亲:CS1513(缺少右花括号)

漏分号的姐妹是漏花括号。同样的排查套路,换个方向:报错行是编译器无路可走的地方——从那里倒着数花括号。

常见问答

怎么修 C# 里的 CS1002?

语句没在期望的位置结束。真正的错误通常在报错行的上一行末尾——在那里补分号。声明、赋值、return、break、continue 和独立调用要分号;if/for/while 圆括号头和闭花括号不要。

为什么 CS1002 报的行号不对?

少分号让编译器把两行粘成一个表达式,直到走不下去才报错——位置在真正错误的下一行。所以一个漏分号常引发一串错误:修第一个、重编译,其余自动消失。

排查清单