2015-03-13 91 views
0

有誰知道下面這段代碼無法編譯VS2013的問題?嵌入式C#lambda表達式作爲函數參數

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編譯,它顯示

命名命令的局部變量不能在此範圍 聲明,因爲它會給一個不同的意思,以命令.... ....

代表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表達式委託類型的委託 System.Func WindowsPhoneTestFramework.Client.AutomationClient.Remote.GenericCommand, System.Action因爲一些在返回類型的塊不能 隱式轉換爲委託返回類型。

回答

3

你有兩個參數共享同一個名字:

  • (command, action) =>是設置了一個param一個動作nammed command

  • return (command) =>是另一個動作,與其他PARAM nammed command

所以你有重命名兩個參數名稱中的一個。

正如@Dirk解釋的那樣,您將返回Action<T>而不是Action。所以你可以試試這個:

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

這不是唯一的東西。 lambda的返回值應該是一個Action,但它是一個Action 。 – Dirk 2015-03-13 08:37:22