Что такое группа методов в C #? - PullRequest
328 голосов
/ 20 мая 2009

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

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 ]

303 голосов
/ 20 мая 2009

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

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

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

151 голосов
/ 26 мая 2010

Кроме того, если вы используете LINQ, вы, очевидно, можете сделать что-то вроде myList.Select(methodGroup).

Так, например, у меня есть:

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

Вместо явного указания переменной, которая будет использоваться следующим образом:

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

Я могу просто опустить имя переменной:

public List<string> GetStringStuff()
{
    return something.getStringsFromSomewhere.Select(DoSomethingToMyString);
}
20 голосов
/ 28 февраля 2013

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

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

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

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

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

Func<string> fn = 123.ToString;
Console.WriteLine(fn());
18 голосов
/ 20 мая 2009

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

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

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

Int32.ToString(IFormatProvider) 

или это может означать:

Int32.ToString()

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

17 голосов
/ 20 мая 2009

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

...