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