2010-10-30 3 views
33

Когда я пытаюсь использовать Params в Action делегат ...Могу ли я использовать params в Action или Func delegates?

private Action<string, params object[]> WriteToLogCallBack; 

Я получил эту ошибку во время проектирования:

Invalid token 'params' in class, struct, or interface member declaration

Любая помощь!

+1

params не является типом, то есть вы можете использовать 'ref' в определении типа? –

ответ

35

Как об этом обходной путь?

private Action<string, object[]> writeToLogCallBack; 
public void WriteToLogCallBack(string s, params object[] args) 
{ 
    if(writeToLogCallBack!=null) 
    writeToLogCallBack(s,args); 
} 

Или вы можете определить свой собственный тип делегата:

delegate void LogAction(string s, params object[] args); 
+0

Как вы это называете лямбдой? – toddmo

3

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

9

Параметры типа Variadic на C# невозможны.

Вот почему есть много объявлений для Action<...>, Func<...> и Tuple<...>, например. Однако это была бы интересная функция. C++ 0x has them.

+0

Не уверен, насколько хорошо он будет работать с дженериками (в отличие от шаблонов). – CodesInChaos

0

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

public delegate T ParamsAction<T>(params object[] oArgs); 

public static T LogAction<T>(string s, ParamsAction<T> oCallback) 
{ 
    Log(s); 
    T result = oCallback(); 
    return T; 
} 

Foo foo = LogAction<Foo>("Hello world.", aoArgs => GetFoo(1,"",'',1.1));