Что такое группа методов в С#?
Я часто сталкивался с такой ошибкой, как "невозможно преобразовать из" группы методов "в" 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
имеет много перегрузок - группа методов была бы группой, состоящей из всех различных перегрузок для этой функции.