你可以在委托中使用params关键字吗?

sl.*_*sl. 31 .net c#

我想定义一个委托,它占用几个日期,一个未知数量的其他参数(使用params关键字),并返回一个对象列表;

Func<DateTime, DateTime, params int[], List<object>>
Run Code Online (Sandbox Code Playgroud)

Visual Studio不喜欢使我认为不允许的语法.谁能告诉我为什么?

Jon*_*eet 46

你不能将params用于除最后一个之外的任何参数......这是它抱怨的一部分.

您也不能params在类型参数中使用.这不仅适用于代表,也适用于一般情况.例如,你不能写:

List<params string[]> list = new List<params string[]>();
Run Code Online (Sandbox Code Playgroud)

但是,您可以声明一个新的委托类型,如下所示:

delegate void Foo(int x, params string[] y);

...

Foo foo = SomeMethod();
foo(10, "Hi", "There");
Run Code Online (Sandbox Code Playgroud)

请注意,方法组转换必须匹配一个采用字符串数组的方法 - 您无法将SomeMethod声明为:

void SomeMethod(int x, string a, string b)
Run Code Online (Sandbox Code Playgroud)

并且期望上述工作,例如.它必须是:

void SomeMethod(int x, string[] args)
Run Code Online (Sandbox Code Playgroud)

(params当然,它也可以使用它自己.)


Sam*_*ell 23

您不能在泛型类型参数上拥有自定义属性(CLI不允许它),并且C#编译器params通过发出System.ParamArrayAttribute相关方法参数来实现关键字.

这将阻止您使用System.Func <...>泛型委托,但您始终可以创建自己的委托类型params.