2009-07-16 2 views
29

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

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

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

ответ

21

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

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

42

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

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

Смежные вопросы