Можете ли вы использовать ключевое слово params в делегате?

Я хочу определить делегат, который принимает пару дат, неизвестное количество других параметров (с использованием ключевого слова params) и возвращает список объектов;

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

Visual Studio не любит синтаксис, который заставляет меня думать, что это запрещено. Может ли кто-нибудь сказать мне, почему?

Ответ 1

У вас не может быть настраиваемых атрибутов для аргумента общего типа (CLI не позволяет его), а компилятор С# реализует ключевое слово params, испуская System.ParamArrayAttribute по соответствующему параметру метода.

Это не позволяет вам использовать его с помощью System.Func <... > общие делегаты, но вы всегда можете создать свой собственный тип делегата, который использует params.

Ответ 2

Вы не можете использовать параметры для любого параметра, отличного от последнего... того, что он жалуется.

Вы также не можете использовать 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 сам, конечно.)