J'ai souvent rencontré une erreur telle que "impossible de convertir de 'groupe de méthodes' en 'chaîne'" dans les cas suivants:
var list = new List<string>();
// ... snip
list.Add(someObject.ToString);
bien sûr, il y avait une faute de frappe dans la dernière ligne car j'avais oublié les parenthèses d'invocation après ToString
. La forme correcte serait:
var list = new List<string>();
// ... snip
list.Add(someObject.ToString()); // <- notice the parentheses
Cependant, je me suis demandé ce qu'est un groupe de méthodes. Google n'est pas très utile ni MSDN .
Un groupe de méthodes est le nom d’un ensemble de méthodes (qui pourrait n’en être qu’un) - c’est-à-dire que la méthode ToString
peut avoir plusieurs surcharges (plus les méthodes d’extension): ToString()
, ToString(string format)
, etc - d’où ToString
est en soi un "groupe de méthodes".
Il peut généralement convertir un groupe de méthodes en un délégué (typé) à l'aide de la résolution de surcharge - mais pas en une chaîne, etc. ça n'a pas de sens.
Une fois que vous ajoutez des parenthèses, encore une fois; la résolution de surcharge commence et vous avez identifié sans ambiguïté un appel de méthode.
De plus, si vous utilisez LINQ, vous pouvez apparemment faire quelque chose comme myList.Select(methodGroup)
.
Donc, par exemple, j'ai:
private string DoSomethingToMyString(string input)
{
// blah
}
Au lieu d’indiquer explicitement la variable à utiliser comme ceci:
public List<string> GetStringStuff()
{
return something.getStringsFromSomewhere.Select(str => DoSomethingToMyString(str));
}
Je peux juste omettre le nom du var:
public List<string> GetStringStuff()
{
return something.getStringsFromSomewhere.Select(DoSomethingToMyString);
}
Vous pouvez convertir un groupe de méthodes en un délégué.
La signature du délégué sélectionne 1 méthode sur le groupe.
Cet exemple sélectionne la surcharge ToString()
qui prend un paramètre de chaîne:
Func<string,string> fn = 123.ToString;
Console.WriteLine(fn("00000000"));
Cet exemple sélectionne la surcharge ToString()
qui ne prend aucun paramètre:
Func<string> fn = 123.ToString;
Console.WriteLine(fn());
Le premier résultat de votre recherche MSDN disait:
Le groupe de méthodes identifie la méthode à invoquer ou l’ensemble des méthodes surchargées à partir desquelles choisir une méthode spécifique à invoquer.
si j'ai bien compris, lorsque vous écrivez simplement someInteger.ToString
, vous pouvez vous référer à:
Int32.ToString(IFormatProvider)
ou il peut se référer à:
Int32.ToString()
c'est ce qu'on appelle un groupe de méthodes.
La fonction ToString
comporte de nombreuses surcharges - le groupe de méthodes serait le groupe constitué de toutes les surcharges différentes pour cette fonction.