2009-05-20 48 views
299

我經常遇到錯誤,如樣病例「可以從‘方法組’到‘串’不轉換」:當然什麼是C#中的方法組?

var list = new List<string>(); 
// ... snip 
list.Add(someObject.ToString); 

有在最後一行一個錯字,因爲我忘了調用括號之後ToString。正確的形式是:

var list = new List<string>(); 
// ... snip 
list.Add(someObject.ToString()); // <- notice the parentheses 

然而,我開始想知道什麼是方法組。 Google不是太多的幫助,也不是MSDN

+52

科C#3.0規範的7.1定義「方法組」。 – 2009-05-20 16:47:50

+1

我現在讀取這個錯誤的原因是*在調用方法時錯過了括號*。 – niico 2016-11-23 01:10:27

回答

279

方法組爲一套方法名稱(這可能是隻有一個) - 即在理論上ToString方法可以具有多個重載(加上任何擴展方法):ToString()ToString(string format)等 - 因此ToString本身就是一個「方法組」。

它通常可以通過使用過載的分辨率轉換的方法組到(鍵入)代表 - 但不是爲字符串等;它沒有任何意義。

一旦添加了括號,再次;重載決議啓動並且您已明確標識了一個方法調用。

+6

方法組的典型用法是什麼?由於(所以我知道)它具有相同的名稱,參數數量和/或類型將有所不同。因此,您無法使用組調用方法組中的多個方法。 – 2009-05-20 10:55:42

+23

它純粹是「我知道方法名是什麼,但我不知道簽名」的編譯器術語。它在運行時不存在。 AFAIK,方法組* *本身*(無括號等)的唯一用法是在委託構建過程中。 – 2009-05-20 11:00:07

16

第一結果在MSDN搜索表示:

的方法,組確定一個 方法來調用或該組 重載方法從中 選擇一個特定的方法來調用

我的理解是,基本上因爲當你剛寫someInteger.ToString時,可能是指:

Int32.ToString(IFormatProvider) 

,或者它可以指:

Int32.ToString() 

因此它被稱爲方法組。

15

ToString功能有許多重載 - 方法組將是由該功能的所有不同的重載的基團。

140

此外,如果你正在使用LINQ,你可以很明顯這樣做myList.Select(methodGroup)

因此,舉例來說,我有:

private string DoSomethingToMyString(string input) 
{ 
    // blah 
} 

相反的明確說明變量要使用這樣的:

public List<string> GetStringStuff() 
{ 
    return something.getStringsFromSomewhere.Select(str => DoSomethingToMyString(str)); 
} 

我就可以省略變種的名稱:

public List<string> GetStringStuff() 
{ 
    return something.getStringsFromSomewhere.Select(DoSomethingToMyString); 
} 
17

您可以將方法組轉換爲委託。

委託簽名選擇方法1到組外。

此示例採ToString()過載,這需要字符串參數:

Func<string,string> fn = 123.ToString; 
Console.WriteLine(fn("00000000")); 

此示例採ToString()過載,其沒有參數:

Func<string> fn = 123.ToString; 
Console.WriteLine(fn()); 
相關問題