将方法隐式转换为Func <t,tresult =“”>

时间:2016-07-27 21:31:07

标签: c# delegates extension-methods

我有一个扩展类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&#39; WebClient.DownloadString(string)&#39;是一种方法,在给定的上下文中无效

我能做些什么来让我的扩展方法像我想要的那样工作吗?

2 个答案:

答案 0 :(得分:2)

不,您无法在方法组或匿名函数上调用扩展方法。

C#规范的第7.6.5.2节要求:

  

expr 到M j 的第一个参数的类型存在隐式标识,引用或装箱转换。

(其中 expr 是您尝试调用扩展方法的表达式,M j 是扩展方法本身。)

方法组转换(允许您编写Func<string, string> func = request.DownloadString;的转换)身份,参考或装箱转换。这是一种单独的转换(规范的第6.6节)。

答案 1 :(得分:1)

  

我能做些什么来让我的扩展方法像我想要的那样工作吗?

没有

扩展方法明确设计为在方法组上工作。