Что такое группа методов в С#?

Я часто сталкивался с такой ошибкой, как "невозможно преобразовать из" группы методов "в" string "в таких случаях, как:

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.

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

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

Int32.ToString(IFormatProvider) 

или он может ссылаться на:

Int32.ToString()

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

Ответ 5

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