385

在以下情况下,我经常遇到诸如“无法从'方法组'转换为'字符串'”之类的错误:

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

4

5 回答 5

363

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

它通常可以通过使用重载解析将方法组转换为(类型化的)委托 - 但不能转换为字符串等;这没有意义。

再次添加括号后;重载决议开始了,你已经明确地确定了一个方法调用。

于 2009-05-20T08:35:33.787 回答
179

此外,如果您使用的是 LINQ,您显然可以执行类似myList.Select(methodGroup).

因此,例如,我有:

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

而不是像这样明确说明要使用的变量:

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

我可以省略 var 的名称:

public List<string> GetStringStuff()
{
    return something.getStringsFromSomewhere.Select(DoSomethingToMyString);
}
于 2010-05-26T16:34:47.507 回答
34

您可以将方法组转换为委托。

委托签名从组中选择 1 个方法。

此示例选择ToString()采用字符串参数的重载:

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

此示例选择ToString()不带参数的重载:

Func<string> fn = 123.ToString;
Console.WriteLine(fn);
于 2013-02-28T00:21:49.617 回答
22

您的 MSDN 搜索中的第一个结果是:

方法组标识要调用的一个方法或一组重载方法,从中选择要调用的特定方法

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

Int32.ToString(IFormatProvider) 

或者可以参考:

Int32.ToString()

所以称为方法组。

于 2009-05-20T08:36:15.300 回答
19

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

于 2009-05-20T08:36:39.603 回答