什么是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());