将可变参数传递给委托
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);
因此您的代表需要同时处理这两个问题。
我有以下代表:
public delegate object DynamicFunction(dynamic target, params object[] args);
但是,当我尝试创建它时:
DynamicFunction func = new DynamicFunction((t) => {
//Handle t
});
即使我将最后一个参数指定为 params object[]
.
如果我将 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);
因此您的代表需要同时处理这两个问题。