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

时间:2009-07-16 09:37:46

标签: c# .net

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

Func<DateTime, DateTime, params int[], List<object>>

Visual Studio不喜欢让我觉得这是不允许的语法。谁能告诉我为什么?

2 个答案:

答案 0 :(得分:46)

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

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

List<params string[]> list = new List<params string[]>();

但是,您可以声明 new 委托类型,如下所示:

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

...

Foo foo = SomeMethod();
foo(10, "Hi", "There");

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

void SomeMethod(int x, string a, string b)
例如,

并期望以上工作。它必须是:

void SomeMethod(int x, string[] args)

(当然,它可以使用params本身。)

答案 1 :(得分:23)

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

这会阻止您使用System.Func&lt; ...&gt;通用委托,但您始终可以创建自己的委托类型,使用params