将变量参数传递给委托

时间:2015-04-28 19:10:25

标签: c# .net c#-4.0 dynamic delegates

我有以下代表:

public delegate object DynamicFunction(dynamic target, params object[] args);

但是,当我尝试创建它时:

DynamicFunction func = new DynamicFunction((t) => {
     //Handle t
});

编译器抛出一个错误,指出委托不接受1个参数,即使我指定了最后一个参数为params object[]类型。

如果我将 exacly one 额外参数传递给委托,则可行。 例如:

DynamicFunction func = new DynamicFunction((t,a) => {
     //Handle t
});

但是,我不想指定额外的参数,因为我故意希望这些参数是可选的。

这里发生了什么?

2 个答案:

答案 0 :(得分:2)

params意味着当你调用函数转换你传递给数组的任何参数时,编译器会做聪明的事情。

这并不意味着函数本身需要1或2个参数,并不意味着有2个版本的函数f(dynamic target)f(dynamic target, params object[] args)

请注意,您仍然希望能够致电

func (1);
func(1, optional1, optional2);

所以你的代表需要同时处理这两个问题。

答案 1 :(得分:1)

调用委托时,调用者可以提供1 ... n个参数。您现在正在做的事情不是调用委托,而是将兼容方法分配给该类型的委托。这样做时,您需要提供正好两个参数(相应类型),因为这是委托的定义所声明的必须接受的内容。