我想定义一个委托,它占用几个日期,一个未知数量的其他参数(使用params关键字),并返回一个对象列表;
Func<DateTime, DateTime, params int[], List<object>>
Visual Studio不喜欢让我觉得这是不允许的语法。谁能告诉我为什么?
答案 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
。