C#中的方法组是什么?

问题描述 投票:0回答:5

我经常遇到诸如“无法从‘方法组’转换为‘字符串’”之类的错误,例如:

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 也没有多大帮助。

c# .net method-group
5个回答
389
投票

方法组是一组方法的名称(可能只有一个) - 即理论上,

ToString
方法可能有多个重载(加上任何扩展方法):
ToString()
ToString(string format)
等- 因此
ToString
本身就是一个“方法组”。

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

添加括号后,再次;重载解析开始,您已经明确识别了方法调用。

链接


192
投票

此外,如果您使用 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);
}

39
投票

您可以将方法组投射到委托中。

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

此示例选择采用字符串参数的

ToString()
重载:

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

此示例选择不带参数的

ToString()
重载:

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

22
投票

MSDN 搜索的第一个结果是:

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

我的理解是,基本上是因为当你只写

someInteger.ToString
时,它可能指的是:

Int32.ToString(IFormatProvider) 

或者可以参考:

Int32.ToString()

所以称为方法组。


20
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.