編譯錯誤 · error CS1061
"X"未包含"Y"的定義
你向一個值索要它的成員——方法、屬性、欄位——而它的型別根本沒有這個成員。和 CS0103(不認識的變數)不同:這裡變數沒問題,是點號後面的部分出了問題。
親眼看它發生
string s = "hello";
Console.WriteLine(s.Lenth); // string 有 Length——不是 Lenth
string s = "hello";
Console.WriteLine(s.Length); // 大寫 L,一個字母不差
成因一:拼寫或大小寫錯(最常見)
錯誤訊息會指明它查詢的確切型別——讀它。'string' 未包含 'Lenth' 的定義說明編譯器知道 s 是字串,並且查遍了字串能做的一切。拼錯是唯一的問題:
| 你寫的 | C# 要的 |
|---|---|
s.Lenth | s.Length |
s.toUpper() | s.ToUpper() — PascalCase 大駝峰 |
list.count | list.Count |
arr.Size | arr.Length — 陣列用 Length,不是 Size |
成因二:自己的成員拼錯
class Dog
{
public string Name;
public void Bark()
{
Console.WriteLine(Name + " says woof");
}
}
Dog d = new Dog { Name = "Rex" };
d.Barkk(); // 少了一個 k
class Dog
{
public string Name;
public void Bark()
{
Console.WriteLine(Name + " says woof");
}
}
Dog d = new Dog { Name = "Rex" };
d.Bark();
成因三:成員存在——但在別的型別上
你把方法調到了錯誤的物件身上。經典:在陣列上調 List 的方法(它們長得像,但不是一回事):
int[] arr = { 1, 2, 3 };
arr.Add(4); // error CS1061: 陣列是定長的——沒有 Add
// 想新增?用 List<int>:
var list = new List<int> { 1, 2, 3 };
list.Add(4); // ✓ 沒問題
成因四:把不是方法的東西當方法呼叫
屬性像欄位一樣讀,不像方法一樣調。給屬性加 () 就會踩中這個錯(Visual Studio 會說 CS1955——"不可呼叫的成員不能像方法一樣使用"):
var list = new List();
list.Add(1);
Console.WriteLine(list.Count()); // Count 是屬性——不能加 ()
var list = new List();
list.Add(1);
Console.WriteLine(list.Count); // 屬性:沒有括號
經驗法則:做某事的是方法(());是某物的是屬性(沒有 ())。list.Add(x) 是動作;list.Count 只是"是"。
常見問答
C# 裡的 CS1061 是什麼意思?
點號後的成員在該型別上不存在。常見原因:拼寫錯(s.Lenth → s.Length)、大小寫錯(s.toUpper() → s.ToUpper())、把屬性當方法呼叫(list.Count() → list.Count)、或在陣列上調 List 的方法。
C# 裡 Count 要不要加括號?
List<T>.Count 是屬性,不加括號;陣列用 .Length,同樣不加。方法才要括號——list.Add(x)、s.ToUpper()。
排查清單
- 讀錯誤訊息:它寫明瞭搜尋的型別——變數沒問題,成員才有問題。
- 查大小寫:C# 成員是大駝峰(
ToUpper、Count、Length)。 - 屬性還是方法:
Count/Length不帶()。 - 成員確實存在?你可能拿錯了型別——陣列有
Length,List有Count和Add。 - Visual Studio 裡敲點號會列出真實成員——信 IntelliSense,別信記憶。