C# 指定一个接受参数的委托

C# 指定一个接受参数的委托,c#,.net,c#-3.0,delegates,C#,.net,C# 3.0,Delegates,我正在查看BackgroundWorker.ReportProgress方法。它可以采用1个参数(int)或两个参数(int,object) 如果要按如下方式分配ReportProgress: var ReportProgressMethod = backgroundWorker.ReportProgress; 我得到一个错误,说有一个模棱两可的引用,因为(当然)该方法可以处理参数集 如何更改上面的语句以表示我希望使用该方法的int,object版本 (这背后的想法是,我希望将ReportPr

我正在查看BackgroundWorker.ReportProgress方法。它可以采用1个参数(int)或两个参数(int,object)

如果要按如下方式分配ReportProgress:

var ReportProgressMethod = backgroundWorker.ReportProgress;
我得到一个错误,说有一个模棱两可的引用,因为(当然)该方法可以处理参数集

如何更改上面的语句以表示我希望使用该方法的
int,object
版本

(这背后的想法是,我希望将ReportProgressMethod作为参数传递给一个方法。)

Action ReportProgressMethod=backgroundWorker.ReportProgress;

有多种方法可以帮助编译器,但基本上只需以某种方式使委托类型显式即可。我的首选是:

var ReportProgressMethod = new Action<int,object>(backgroundWorker.ReportProgress);
var ReportProgressMethod=新操作(backgroundWorker.ReportProgress);

这就是编译器无论如何都要做的事情(实例化一个新委托,不管您是否编写新委托)但igor的评论是正确的,即强制转换也可以工作。

我认为当前编译器不会推断委托类型。@jimmy在右侧键入时会推断委托类型,但如果rhs是lambda表达式,则不会。括号的位置错误。这是有效的:
var blah=(Action)worker.ReportProgress
@不,我没有弄错括号。这是一个实例化,它工作得很好/就像你对一个cast的建议一样,但是这个cast是多余的,因为你的示例实际上会编译成一个实例化和一个cast)事实上你是对的,我错过了新的
。这三种方法(包括接受的答案)的赌注是什么?编译到同一个IL?感谢您标记代码。我不确定编译器是否能够使用lhs的类型信息来确定方法重载
var ReportProgressMethod = new Action<int,object>(backgroundWorker.ReportProgress);