2012-07-18 68 views
0

我旁邊片段:.NET行動質疑

public Action<Action<bool>> GetAction() 
{ 
    return m => MyMethod(123, "string", m); 
} 

private void MyMethod(int someInteger, string someString, Action<bool> boolAction) 
{ 
    // some work with int and string was done 
    boolAction(true); 
} 

能否請你解釋一下我爲什麼這項工作?我看到Action<Action<bool>>需要一些無效的方法,只有一個參數的Action<bool>。那麼這裏有兩個第一個參數有什麼問題?

此外,我不清楚爲什麼我們通過m進入。如何在boolAction(true)中調用這個lambda。那裏會發生什麼?

對此的任何意見將是有益的。

+0

「那麼這裏有兩個第一個參數有什麼問題?」爲什麼你這麼想? – 2012-07-18 12:43:37

+0

我認爲'Action '需要在他的簽名中只帶有一個參數的方法('Action ')。但在我的情況下,我有'Action >'。我對嗎? – 2012-07-18 13:50:08

回答

1

沒有理由,它不應該工作。在創建lambda的行中,C#會自動推斷您的lambda將從哪種類型的GetAction返回值接收參數。要理解這段代碼是很重要的,你看,你是不是返回m,但你正在返回

m => MyMethod(123, "string", m); 

因此,mAction<bool>類型,上面的表達式是Action<Action<bool>>類型,其中內行動實際上是m的。

I.e.

m => MyMethod(123, "string", m); 

創建lambda表達式,其將對應於這個簽名的方法:

void _no_name(Action<bool> m) { 
    MyMethod(123, "string", <delegate_to_no_name>); 
} 

從這一部分,我們看到,mAction<bool>,並_no_nameAction<Action<bool>>

你到底會以某種方式使用此代碼,這樣可能:

Action<Action<bool>> action = GetAction(); 
action(x => MessageBox.Show("X of type bool is " + x.ToString())); 

實際上,我們的消息框電話委託成爲m參數。

+0

那麼爲什麼上面的表達式是'Action >'類型,而不是'Action >'? – 2012-07-18 13:52:12

+0

以上表達式的類型爲'Action >',因爲這是您聲明它在您的方法定義中。你正在返回lambda表達式,這是一個Action。您返回的那個操作需要另一個操作作爲參數。 'm'是那個參數。如果你已經把'public action GetAction','m'的類型設爲'bool',並且'm => MyAction(123,「string」,m)'的類型爲'Action ' – 2012-07-18 14:43:23