編譯錯誤 · 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.Lenths.Length
s.toUpper()s.ToUpper() — PascalCase 大駝峰
list.countlist.Count
arr.Sizearr.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()。

排查清單