2009-12-22 75 views
2

我有兩種方法具有以下簽名使用委託作爲參數

void Invoke(Action method) 
void Foo() 

是什麼的代碼如下兩行之間的區別?

Invoke(new Action(Foo)); 

Invoke(Foo); 

和在第二線允許?

謝謝

+0

您可能想要更好地格式化您的示例。沒有錯,只是爲了清楚起見。請記住,如果一個問題是明確的,而且健康的人會更傾向於回答它。 美也幫助(格式等)。 – lorenzog

+0

糾錯:第一種方法應如下閱讀 void Invoke(Action method) 現在兩行都會編譯,但它們之間有什麼區別? 謝謝 – Exulted

回答

2

你的簽名是「Invoke(Delegate method)」(大寫'D'),不是嗎?

只有構建Action的第一行顯式工作。

背後的原因:Delegate是所有代表的基類。它表示具有未知返回值和未知數量和類型參數的代表。 您只能使用DynamicInvoke調用它。

所以編譯器不知道,只傳遞一個方法名稱時使用的委託的實際類型:「Invoke(Foo);」。它可以是一個Action,也可以是另一個與Foo簽名相同的代表。

但是,如果你明確地創建委託,也可以隱式轉換爲代表,因此代碼編譯。

+0

是的,這正是我的typin :) 我認爲這是值得解釋你如何知道它的意思是'代表'? –

+0

嗯 - 如果在方法的參數列表中使用「委託」而不是「委託」,這將導致5個編譯器錯誤,因爲「委託」是定義委託和匿名方法的特殊關鍵字。 – Matthias

+0

在最後一次編輯之後(簽名是「void Invoke(Action method)」)Maximilian Mayerl是對的。 – Matthias

3

你爲什麼不嘗試呢?

如果你的方法的簽名是

void Invoke(Action objAction) 

那麼它就是合法的。然後這兩個電話是一樣的。這個功能被稱爲「隱式方法組轉換」。