编译错误 · error CS0117
"X"未包含"Y"的定义
类没问题——成员名有问题。这是 CS1061 的"类型级"孪生:你走的是类名,而不是对象。
亲眼看它发生
Console.WritLine("hello"); // 'WritLine' 少一个 t —— WriteLine
消息里写明了它搜索的类(Console),所以你知道类型解析成功了。剩下唯一的问题就是点号后面那个拼写。
人人都犯的拼写错
| 你写的 | C# 要的 | 说明 |
|---|---|---|
Console.WritLine | Console.WriteLine | 少了个 e |
Console.writeline | Console.WriteLine | 要大驼峰 |
Math.Sqr | Math.Sqrt | 少了个 t |
Math.Pi | Math.PI | 全大写 |
成因一:拼写错(几乎总是)
Console.WriteLine(Math.Sqr(16));
Console.WriteLine(Math.Sqrt(16)); // 正确的名字
成因二:成员存在,但不是静态的
如果成员是实例成员,你不能通过类名访问它——你需要一个对象:
class Counter
{
public int Value = 0; // 实例字段
public static int Total = 0; // 静态字段
}
Counter.Total = 5; // ✓ 静态:通过类访问
// Counter.Value = 5; // ✗ 没有静态的 Value
var c = new Counter();
c.Value = 5; // ✓ 实例:通过对象访问
成因三:类搞错了
有时候方法确实存在,只是住在另一个类型上。Length 属于字符串和数组;Count 属于 List。而 Console.Length 哪里都没有:
int.Prase("5"); // int 有 Parse —— 不是 Prase
string.Jion(",", new string[0]); // string 有 Join —— 不是 Jion
Console.WriteLine(int.Parse("5")); // 正确的名字
string[] parts = { "a", "b" };
Console.WriteLine(string.Join("-", parts)); // Join 也能用
CS0117 与 CS1061,各一行
| 错误码 | 你写的 | 含义 |
|---|---|---|
CS0117 | Type.Member | 该类型上没有这个成员 |
| CS1061 | obj.Member | 该对象的类型上没有这个成员 |
修法一样——先查拼写,再查类型对不对。
常见问答
CS0117 是什么意思?
类型存在但没有那个成员——通常是静态成员拼错,如 Console.WritLine 或 Math.Sqr。
和 CS1061 的区别?
CS0117 走类型名(Type.Member);CS1061 走实例(obj.Member)。成因和修法一样。
排查清单
- 读消息里的类名——确认那是不是你要的类型。
- 慢慢重打成员名;大驼峰,一个字母都别差。
- 是实例成员?你需要对象,不是类名。
- 用 IntelliSense:敲出点号,让编辑器证明什么存在。