什么是C#中的方法组?

我经常遇到如下错误:“无法从'方法组'转换为'string'”,例如:

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

当然在最后一行有一个错字,因为我在ToString后面忘了调用括号。 正确的forms是:

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

但是我开始想知道什么是方法组。 谷歌没有太多的帮助,也没有MSDN 。

方法组是一组方法的名称(可能只是一个) – 也就是说,理论上ToString方法可能有多个重载(加上任何扩展方法): ToString()ToString(string format)等 – 因此ToString本身就是一个“方法群”。

它通常可以通过使用重载决策将方法组转换为(types)委托 – 但不是string等; 这没有意义。

一旦再添加括号, 重载决议踢了,你已经明确地确定了方法调用。

另外,如果你正在使用LINQ,你显然可以做一些像myList.Select(methodGroup)

所以,例如,我有:

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

而不是显式地说明要这样使用的variables:

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

我可以忽略var的名字:

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

ToString函数有很多重载 – 方法组将是由该函数的所有不同重载组成的组。

你的MSDNsearch的第一个结果是:

方法组标识要调用的一个方法或从中select要调用的特定方法的重载方法集

我的理解是,基本上,因为当你只是写someInteger.ToString ,它可能是指:

 Int32.ToString(IFormatProvider) 

或者可以参考:

 Int32.ToString() 

所以它被称为方法组。

你可以将一个方法组转换成一个委托。

代表签名从组中select1个方法。

这个例子select带有string参数的ToString()重载:

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

这个例子select不带参数的ToString()重载:

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