¿Qué es un grupo de métodos en C #?

A menudo he encontrado un error como “no se puede convertir de ‘grupo de métodos’ a ‘cadena'” en casos como:

var list = new List(); // ... snip list.Add(someObject.ToString); 

por supuesto, había un error tipográfico en la última línea porque olvidé el paréntesis de invocación después de ToString . La forma correcta sería:

 var list = new List(); // ... snip list.Add(someObject.ToString()); // <- notice the parentheses 

Sin embargo, llegué a preguntarme qué es un grupo de métodos. Google no es de mucha ayuda ni MSDN .

Un grupo de métodos es el nombre de un conjunto de métodos (que podría ser solo uno), es decir, en teoría, el método ToString puede tener múltiples sobrecargas (más cualquier método de extensión): ToString() , ToString(string format) , etc. – por ToString tanto ToString por sí mismo es un “grupo de métodos”.

Por lo general, puede convertir un grupo de métodos en un delegado (tipeado) mediante la resolución de sobrecarga, pero no a una cadena, etc .; no tiene sentido.

Una vez que agregas paréntesis, de nuevo; la resolución de sobrecarga entra en acción y usted ha identificado inequívocamente una llamada a un método.

Además, si está utilizando LINQ, aparentemente puede hacer algo como myList.Select(methodGroup) .

Entonces, por ejemplo, tengo:

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

En lugar de indicar explícitamente la variable que se utilizará de esta manera:

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

Puedo omitir el nombre de la var:

 public List GetStringStuff() { return something.getStringsFromSomewhere.Select(DoSomethingToMyString); } 

Puede convertir un grupo de métodos en un delegado.

La firma del delegado selecciona 1 método fuera del grupo.

Este ejemplo selecciona la sobrecarga ToString() que toma un parámetro de cadena:

 Func fn = 123.ToString; Console.WriteLine(fn("00000000")); 

Este ejemplo selecciona la sobrecarga de ToString() que no toma parámetros:

 Func fn = 123.ToString; Console.WriteLine(fn()); 

El primer resultado en su búsqueda de MSDN dijo:

El grupo de métodos identifica el método a invocar o el conjunto de métodos sobrecargados a partir del cual se puede elegir un método específico para invocar

mi entendimiento es que, básicamente, porque cuando simplemente escribes someInteger.ToString , puede referirse a:

 Int32.ToString(IFormatProvider) 

o puede referirse a:

 Int32.ToString() 

por lo que se llama un grupo de métodos.

La función ToString tiene muchas sobrecargas: el grupo de métodos sería el grupo que consta de todas las sobrecargas diferentes para esa función.