Можете ли вы использовать ключевое слово params в делегате? - PullRequest
31 голосов
/ 16 июля 2009

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

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

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

Ответы [ 2 ]

46 голосов
/ 16 июля 2009

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

23 голосов
/ 16 июля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...