具有可变参数的函数的委托

Soh*_*amC 11 c# delegates func

我有这种功能

void func(params object[] parameters) { 
    //Function Body
}
Run Code Online (Sandbox Code Playgroud)

它可以接受以下类型的参数

func(10, "hello", 30.0);
func(10,20);
Run Code Online (Sandbox Code Playgroud)

等等.

我想Action为上面的函数创建一个委托.可能吗?如果不是那么为什么?

Jon*_*eet 16

您不能使用现有的Action委托params,但您可以这样声明自己的委托:

public delegate void ParamsAction(params object[] arguments)
Run Code Online (Sandbox Code Playgroud)

然后:

// Note that this doesn't have to have params, but it can do
public void Foo(object[] args)
{
    // Whatever
}

...

ParamsAction action = Foo;
action("a", 10, 20, "b");
Run Code Online (Sandbox Code Playgroud)

当然你可以Action<object[]>为你现有的方法创建一个- 但你失去了params它的方面,因为它没有被声明Action<T>.例如:

public static void Foo(params object[] x)
{
}

...

Action<object[]> func = Foo;
func("a", 10, 20, "b"); // Invalid
func(new object[] { "a", 10, 20, "b" }); // Valid
Run Code Online (Sandbox Code Playgroud)

因此,如果您从想要使用的代码调用委托params,则需要一个委托类型,其中包含声明中的委托类型(根据第一部分).如果你只是想创建它接受一个委托object[],那么你可以创建一个实例Action<object[]>使用具有方法params在其签名-它只是一个修改器,有效.