Что такое группа методов в 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.

5 ответов


группа методов-это имя для набор методов (это может быть только один) - т. е. теоретически ToString метод может иметь несколько перегрузок (плюс любые методы расширения): ToString(), ToString(string format), etc-следовательно ToString сам по себе является "группой методов".

обычно он может преобразовать группу методов в (типизированный) делегат с помощью разрешения перегрузки , но не в строку и т. д.; Это не имеет смысла.

как только вы добавляете круглые скобки, снова; разрешение перегрузки in и вы однозначно идентифицировали вызов метода.


кроме того, если вы используете 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);
}

вы можете разыграть группа методов в делегат.

подпись делегата выбирает 1 метод из группы.

этот пример выбирает ToString() перегрузка, которая принимает строковый параметр:

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

этот пример выбирает ToString() перегрузка, которая не принимает никаких параметров:

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

первый результат в вашем поиске MSDN сказал:

группа методов идентифицирует способ вызова или набор перегруженные методы от выберите конкретный метод для вызова

Я понимаю, что в основном потому, что когда вы просто пишете someInteger.ToString, это может означать:

Int32.ToString(IFormatProvider) 

или это может относиться к:

Int32.ToString()

поэтому он называется групповым методом.


на ToString функция имеет много перегрузок-группа методов будет группой, состоящей из всех различных перегрузок для этой функции.