2016-07-27 9 views
2

私は署名このようになりますFunc<T, TResult>を拡張する拡張クラスを持っている:暗黙の変換

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

私はそうのようFunc<T, TResult>にメソッドをキャストすることによって方法でそれを実装することができます。.. 。

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

しかし、私が本当にやりたいことはこれです:

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

しかし、このコンパイル時にエラーが発生します。

CS0119「WebClient.DownloadString(文字列)」が指定されたコンテキスト

では有効ではない方法で、私は私がそれをしたいように動作するように私の拡張メソッドを取得するために何かできることはありますに?

答えて

2

いいえ、メソッドグループまたは匿名関数で拡張メソッドを呼び出すことはできません。

暗黙アイデンティティ、参照又はボクシング変換がexprのからM Jの最初のパラメータの型に存在する:C#の仕様の

セクション7.6.5.2はそれを必要とします。

exprのはあなたが上の拡張メソッドを呼び出すようにしようとしている式であり、M Jは、拡張メソッド自体であるところ。)

法の基変換(変換あなたはFunc<string, string> func = request.DownloadString;を書くことができます)ではないアイデンティティ、参照またはボクシングの変換です。これは別の種類の変換です(仕様の6.6節)。

1

私の望むように私の拡張メソッドを動作させるためにできることはありますか?

拡張メソッドを明示的メソッド基上ない動作するように設計しました。

+1

正規の静的メソッドの呼び出し構文は、私の場合は、与えられた例で働く可能性があります - おそらくC#6の方が良いですか? –

+0

クイック返信ありがとう! :)私はあなたが「普通の」方法ではうまくいかないと言ったときの意味を理解していません。あなたは精緻化できますか? – yozepi

+0

Bummer。私はより良い幸福を望みました。 – yozepi