編譯錯誤 · 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:敲出點號,讓編輯器證明什麼存在。