我可以在Action或Func委托中使用params吗?

Hom*_*mam 39 c# delegates action params-keyword

当我试图在Action委托中使用params时......

private Action<string, params object[]> WriteToLogCallBack;
Run Code Online (Sandbox Code Playgroud)

我收到了这个设计时错误:

类,结构或接口成员声明中的标记'params'无效

任何帮助!

Cod*_*aos 41

这个解决方法怎么样?

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

或者您可以定义自己的委托类型:

delegate void LogAction(string s, params object[] args);
Run Code Online (Sandbox Code Playgroud)

  • 你怎么称呼这个lambda? (3认同)

Jor*_*dão 11

C#中无法使用变量类型参数.

这就是为什么有是许多声明Action<...>,Func<...>以及Tuple<...>,例如.不过,这将是一个有趣的功能.C++ 0x 有它们.


小智 5

你可以试试这个.它允许任意数量的参数,如果传递错误的数字或类型的参数,您将得到编译时错误.

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));
Run Code Online (Sandbox Code Playgroud)