2016-07-27 14 views
2

Ich habe eine eine Erweiterung Klasse, die Func<T, TResult> dessen Unterschrift sieht wie folgt erweitert:Implizite Konvertierung eines Verfahrens Func <T, Tresult>

public static ITryAndReturnValue<TResult> Try<T, TResult>(this Func<T, TResult> func, T arg, int retries) 

ich es auf ein Verfahren, durch das Gießen der Methode Func<T, TResult> wie so umsetzen können .. .

Func<string, string> func = request.DownloadString; 
string response = func.Try(urlA, 3); 

Aber was ich wirklich will, ist dies zu tun:

string response = request.DownloadString.Try(urlA, 3); 

Aber ich bekomme diesen Kompilierzeitfehler.

CS0119 ‚WebClient.DownloadString (string)‘ ist eine Methode, die nicht gültig im gegebenen Kontext ist

Gibt es etwas, was ich tun kann, um meine Extension-Methode zu arbeiten, wie ich es will zu?

Antwort

2

Nein, Sie können keine Erweiterungsmethode für eine Methodengruppe oder eine anonyme Funktion aufrufen.

Abschnitt 7.6.5.2 der C# Spezifikation erfordert, dass:

Eine implizite Identität, Referenz oder Boxen Umwandlung von existiert expr auf die Art des ersten Parameters M j.

(Wo ausdr ist der Ausdruck Sie versuchen, auf die Erweiterung Methode aufzurufen, und M j ist die Erweiterung Methode selbst.)

A Methode Gruppenumwandlung (die Umwandlung Das ermöglicht Ihnen zu schreiben Func<string, string> func = request.DownloadString;) ist nicht eine Identität, Referenz oder Boxen Umwandlung. Es ist eine separate Art der Konvertierung (Abschnitt 6.6 der Spezifikation).

1

Kann ich irgendetwas tun, damit meine Erweiterungsmethode so funktioniert, wie ich es möchte?

No.

Erweiterungsmethoden wurden entwickelt, um explizit nicht Arbeit an Methodengruppen.

+1

Die normale statische Methodenaufrufsyntax funktioniert für mich mit dem gegebenen Beispiel - möglicherweise wegen der besseren Besserung in C# 6? –

+0

Danke für die schnelle Antwort! :) Ich verstehe nicht, was du meinst, wenn du sagst, dass es nicht "normal" funktionieren wird. Kannst du es ausarbeiten? – yozepi

+0

Bummer. Ich wünschte, ich hätte bessere Besserung. – yozepi