Могу ли я использовать параметры в Action или Func delegates?
Когда я пытаюсь использовать params в делетете Action...
private Action<string, params object[]> WriteToLogCallBack;
Я получил эту ошибку времени проектирования:
Недопустимый параметр "token token" в объявлении члена класса, структуры или интерфейса
Любая помощь!
Ответы
Ответ 1
Как об этом обходном пути?
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);
Ответ 2
Параметры типа Variadic невозможны в С#.
Вот почему есть много объявлений для Action<...>
, Func<...>
и Tuple<...>
, например. Однако это была бы интересная функция. С++ 0x имеет их.
Ответ 3
Вы можете использовать params
в фактическом объявлении делегата, но не в типе одного. Общие параметры для Action - это только типы, а не фактические аргументы, которые должны быть переданы при вызове делегата. params не является типом, это ключевое слово.
Ответ 4
Вы можете попробовать это. Он допускает любое количество аргументов, и вы получите ошибку времени компиляции, если вы передадите неправильный номер или тип аргументов.
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));