编译错误 · error CS0103

当前上下文中不存在名称"X"

你用了一个名字——变量、方法或类——而编译器从你使用的位置看不到它。三种成因覆盖几乎全部场景:拼写错、作用域不对、或者压根没声明。

成因一:拼写错(最常见)

变量叫 score,你写成了 scroe。C# 区分大小写,Score ≠ score:

int score = 100;
Console.WriteLine(scroe);   // 拼写错:声明的是 score,用的是 scroe
int score = 100;
Console.WriteLine(score);   // 完全一致——连大小写一起

成因二:在它存在之前就用了

变量从声明的那一行往下才存在。在声明上一行用它就会失败:

Console.WriteLine(total);   // total 声明在这一行的*下面*
int total = 42;
int total = 42;             // 先声明……
Console.WriteLine(total);   // ……后使用

成因三:出了作用域——花括号陷阱

声明在某个块 { … } 里面的变量,在闭花括号处就死了。这是从 Python 或 JavaScript 过来的人最容易栽的地方:

for (int i = 0; i < 3; i++)
{
    int doubled = i * 2;
}
Console.WriteLine(doubled);   // doubled 只活在循环体里

修法:把声明挪到你需要的那一层:

int last = 0;
for (int i = 0; i < 3; i++)
{
    last = i * 2;             // 在里面赋值……
}
Console.WriteLine(last);      // ……在外面读(最后一次是 2*2)

成因四:类里根本没有这个成员

调用了不存在的方法——或者调用了方法却忘了括号——报的是同一套码:

PrintReport();   // 哪里都没有这个方法
void PrintReport()
{
    Console.WriteLine("Report: all good");
}

PrintReport();   // 现在这个名字存在了

常见问答

怎么快速修 CS0103?

点进报错的行号,把拼写正反各读一遍。搜整个文件找声明:找不到,就是拼写错或者压根没声明;找到了,检查声明和你使用位置之间的花括号——中间每一对 { } 是否都在使用前闭合了。再查大小写:name、Name、NAME 是三个不同的名字。

CS0103 和 CS0246 有什么区别?

CS0103 是未知的变量(或当前作用域里的方法);CS0246 是未知的类型——类、接口、命名空间名。报错对象不同,排查方向也不同。

一分钟排查流程