你可以在委托中使用params关键字吗?
问题描述:
我想定义一个委托,它需要一些日期,其他参数数量未知(使用params关键字),并返回一个对象列表;你可以在委托中使用params关键字吗?
Func<DateTime, DateTime, params int[], List<object>>
Visual Studio不喜欢让我觉得这不被允许的语法。谁能告诉我为什么?
答
你不能有自定义一个泛型类型参数属性(CLI不会允许它) ,并且C#编译器通过在相关方法参数上发出System.ParamArrayAttribute
来实现params
关键字。
这会阻止您将它与System.Func <...>泛型委托一起使用,但您始终可以创建使用params
的自己的委托类型。
答
除了最后一个参数之外,你不能使用参数作为参数,这是它抱怨的一部分。
您也不能在类型参数中使用params
。这不仅适用于代表,而且一般来说。例如,你可以不写:
List<params string[]> list = new List<params string[]>();
你可以,但是,声明新委托类型,像这样:
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
本身,当然)