2010-01-02 72 views
9

我在我的代碼中定義一個委託一個lambda或匿名函數:寫一個接受了參數

public bool delegate CutoffDateDelegate(out DateTime cutoffDate); 

我想創建委託,並與一個lambda或匿名函數初始化,但這些都不編譯。

CutoffDateDelegate del1 = dt => { dt = DateTime.Now; return true; } 
CutoffDateDelegate del2 = delegate(out dt) { dt = DateTime.Now; return true; } 

有沒有辦法做到這一點?

+2

意識到這是一種老了,但我不要認爲它是重複的。鏈接的問題是關於在匿名函數內使用父(?)函數的out參數,而這個是關於聲明一個擁有它自己的out參數的匿名函數。 – Salvador 2015-05-17 01:17:21

回答

18

您可以使用拉姆達或匿名委託語法 - 你只需要指定參數的類型,並將其標記爲出:

public delegate bool CutoffDateDelegate(out DateTime cutoffDate); 

// using lambda syntax: 
CutoffDateDelegate d1 = 
    (out DateTime dt) => { dt = DateTime.Now; return true; }; 

// using anonymous delegate syntax: 
CutoffDateDelegate d2 = 
    delegate(out DateTime dt) { dt = DateTime.Now; return true; } 

雖然明確聲明參數作爲參考,預計輸入/輸出,不得不在lambda表達式中聲明參數類型,因爲編譯器通常可以推斷它們。但是,在這種情況下,編譯器當前不會推斷lambda/anon表達式中out或ref參數的類型。我不確定這種行爲是否是一個錯誤/疏忽,或者是否有語言原因,爲什麼必須這樣做,但有一個簡單的解決方法。

編輯:我沒有在VS2010β2進行快速檢查,它仍然看起來像你必須定義的參數類型 - 它們不是推斷C#4

+4

我不認爲這既不是一個錯誤,也不是一個疏忽。我認爲你應該明確表示這是一個out或ref參數。爲什麼你不能只寫'(out dt)=> ...'是另一回事。 – 2010-01-02 04:11:24

+1

這實際上就是我所指的 - 在C#中明確標記出參數/ ref。不得不聲明lambda表達式的參數類型不太常見,因爲在大多數情況下,編譯器在推斷類型方面做得非常出色。我會更新我的帖子,使其更清晰。 – LBushkin 2010-01-02 04:16:41

+2

只是偶然發現了這一點 - 注意如果你有多個參數,你必須明確地聲明它們的所有類型,即使它們不全是ref/out – drzaus 2012-04-25 17:58:36