将可变参数传递给委托

Passing variable arguments to a delegate

我有以下代表:

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

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

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

即使我将最后一个参数指定为 params object[].

类型,编译器也会抛出一个错误,指出委托不接受 1 个参数

如果我将 exacly 一个 额外参数传递给委托,它就可以工作。 例如:

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

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

这里发生了什么?

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

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

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

请注意,您仍然希望能够调用

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

因此您的代表需要同时处理这两个问题。