Implicit conversion of a method to Func<T, Tresult>

本文关键字:lt gt Tresult Func of conversion method to Implicit | 更新日期: 2023-09-27 17:58:53

我有一个扩展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(string)"是一个方法,在给定的上下文中无效

我能做些什么让我的扩展方法像我希望的那样工作吗?

Implicit conversion of a method to Func<T, Tresult>

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

C#规范第7.6.5.2节要求:

存在从expr到Mj的第一个参数类型的隐式身份、引用或装箱转换。

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

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

我能做些什么让我的扩展方法像我希望的那样工作吗?

没有。

扩展方法被明确设计为而不是在方法组上工作。