嵌入式C#lambda表达式作为函数参数

时间:2015-03-13 08:33:05

标签: c# lambda windows-phone

有没有人知道下面的代码是什么问题,无法在VS2013中编译?

GenericCommand.AddHandlerFactory("MyKey", (cmd, action) =>
{
  return (command) =>
  {
    var result = new SuccessResult() { ResultText = "some example text" };
    result.Send(command.Configuration);
  };
});

AddHandlerFactory的原型是:

public static void AddHandlerFactory(string key, Func<GenericCommand, Action> handlerFactory)

在VS2013中编译时,显示

  

无法在此范围内声明名为command的局部变量   因为它会给命令带来不同的意义...... ....

  

委托System.Func   WindowsPhoneTestFramework.Client.AutomationClient.Remote.GenericCommand,   System.Action不带2个参数

源代码的更多细节如下: https://github.com/Expensify/WindowsPhoneTestFramework/blob/master/Client/AutomationClient/Remote/GenericCommand.cs

EDIT1将第一个命令重命名为cmd,解决了第一个错误消息。但它仍然无法编译。

错误消息是:

  

无法将lambda表达式转换为委托类型Delegate   System.Func   WindowsPhoneTestFramework.Client.AutomationClient.Remote.GenericCommand,   System.Action,因为块中的某些返回类型不是   隐式转换为委托返回类型。

1 个答案:

答案 0 :(得分:3)

您有两个共享相同名称的参数:

  • (command, action) =>是一个带有参数的command

  • return (command) =>是另一个行动,另一个参数被command

所以你必须重命名两个参数名称中的一个。

正如@Dirk所解释的那样,您返回的是Action<T>而不是Action。所以你可以试试这个:

GenericCommand.AddHandlerFactory("MyKey", (cmd, action) =>
{
  return () =>
  {
    var result = new SuccessResult() { ResultText = "some example text" };
    result.Send(cmd.Configuration);
  };
});