407 Stimmen

Was ist eine Methodengruppe in C#?

Ich habe oft eine Fehlermeldung wie "cannot convert from 'method group' to 'string'" in Fällen wie diesen gefunden:

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

Natürlich gab es in der letzten Zeile einen Tippfehler, denn ich vergaß die Aufrufklammern nach ToString . Die korrekte Form wäre:

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

Ich habe mich jedoch gefragt, was eine Methodengruppe ist. Google ist keine große Hilfe und MSDN .

383voto

Marc Gravell Punkte 970173

Eine Methodengruppe ist der Name für eine Methodensatz (das könnte nur einer sein) - d.h. theoretisch kann die ToString Methode kann mehrere Überladungen haben (plus eventuelle Erweiterungsmethoden): ToString() , ToString(string format) , usw. - daher ToString ist selbst eine "Methodengruppe".

Normalerweise kann eine Methodengruppe in einen (typisierten) Delegaten konvertiert werden, indem die Überladungsauflösung verwendet wird - aber nicht in einen String usw.; das macht keinen Sinn.

Sobald Sie Klammern hinzufügen, tritt wieder die Überladungsauflösung in Kraft und Sie haben einen Methodenaufruf eindeutig identifiziert.

189voto

Kaeles Punkte 1801

Auch, wenn Sie LINQ verwenden, können Sie offenbar etwas wie tun myList.Select(methodGroup) .

So habe ich zum Beispiel:

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

Anstatt die zu verwendende Variable explizit anzugeben, wie hier:

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

Ich kann einfach den Namen der Variable weglassen:

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

38voto

Jack Punkte 4364

Sie können eine Methodengruppe in einen Delegierten.

Die Delegatensignatur wählt 1 Methode aus der Gruppe aus.

Dieses Beispiel wählt die ToString() Überladung, die einen String-Parameter annimmt:

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

Dieses Beispiel wählt die ToString() Überladung, die keine Parameter benötigt:

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

22voto

oscarkuo Punkte 10273

Das erste Ergebnis in Ihrer MSDN-Suche lautet:

T aufzurufende Methode oder die Menge der überladenen Methoden, aus denen eine bestimmte aufzurufende Methode auszuwählen

Ich habe das so verstanden, dass man, wenn man einfach schreibt someInteger.ToString kann es sich beziehen auf:

Int32.ToString(IFormatProvider) 

oder es kann sich auf beziehen:

Int32.ToString()

daher wird sie als Methodengruppe bezeichnet.

20voto

1800 INFORMATION Punkte 125009

En ToString Funktion viele Überladungen hat - die Methodengruppe wäre die Gruppe, die aus allen verschiedenen Überladungen für diese Funktion besteht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X