2017-02-01 154 views
2
return (Func<object, Task<object>>)(async (dynamic data) => 
{ 
    methodCall(data.data, data.more); 
    return null; 
}); 

從我上面收集的代碼正在做的事情來看,它將顯式地將lambda函數作爲委託來轉換,然後返回該委託(在這種情況下,它將返回一個edgejs函數)。爲什麼在這個lambda函數週圍需要括號?

當parens被刪除時,從構建過程收到8個錯誤。

語法錯誤, '' 預期

;預計

}預期

名稱異步不會在當前的背景下存在

名稱動態並不在當前的背景下存在

名稱的數據並不在當前的背景下

存在

當前上下文中不存在名稱數據

名稱數據不存在於當前上下文

+1

拿出來看它是否編譯...(提示 - 它不!) –

+0

@RB .:從問題的標題來看,我認爲他們已經做到了。 – BoltClock

+1

噢,夠公平的,在這種情況下,就是要確保演員在完整的lambda函數上運行。 –

回答

2

有可能的,這是因爲async is a contextual keyword在方法或lambda簽名修改時出現的,只有具有特殊的意義。解析器認爲async是一個方法名,由於編譯器無法找到具有該名稱的方法(並且由於解析器在該位置不再使用lambda表達式,因此在=>上解析錯誤),導致錯誤點)。

+0

Ahhhh,好的。這是有道理的。感謝你的回答! .Net中的異步相對較新,因此可以非常好地清除所有內容。沒有意識到異步是一個上下文關鍵字。 – Robocrypt

+2

它是上下文的,以便任何在過去的十年半中使用'async'作爲變量名的人在升級時不會突然破壞他們的代碼。 –

+2

@Robocrypt將關鍵字添加到現有語言中是一件棘手的事情,因爲這是一個突破性的改變。這就是爲什麼新功能通常會嘗試重複使用現有關鍵字或使用上下文關聯的語法,這些語法會使得破壞現有代碼的概率不存在或非常低。前者的例子:in,out和later:yield,async,await,var等。 – InBetween

相關問題