我有兩種方法具有以下簽名使用委託作爲參數
void Invoke(Action method)
void Foo()
是什麼的代碼如下兩行之間的區別?
Invoke(new Action(Foo));
和
Invoke(Foo);
和在第二線允許?
謝謝
我有兩種方法具有以下簽名使用委託作爲參數
void Invoke(Action method)
void Foo()
是什麼的代碼如下兩行之間的區別?
Invoke(new Action(Foo));
和
Invoke(Foo);
和在第二線允許?
謝謝
你的簽名是「Invoke(Delegate method)」(大寫'D'),不是嗎?
只有構建Action的第一行顯式工作。
背後的原因:Delegate是所有代表的基類。它表示具有未知返回值和未知數量和類型參數的代表。 您只能使用DynamicInvoke調用它。
所以編譯器不知道,只傳遞一個方法名稱時使用的委託的實際類型:「Invoke(Foo);」。它可以是一個Action,也可以是另一個與Foo簽名相同的代表。
但是,如果你明確地創建委託,也可以隱式轉換爲代表,因此代碼編譯。
你爲什麼不嘗試呢?
如果你的方法的簽名是
void Invoke(Action objAction)
那麼它就是合法的。然後這兩個電話是一樣的。這個功能被稱爲「隱式方法組轉換」。
您可能想要更好地格式化您的示例。沒有錯,只是爲了清楚起見。請記住,如果一個問題是明確的,而且健康的人會更傾向於回答它。 美也幫助(格式等)。 – lorenzog
糾錯:第一種方法應如下閱讀 void Invoke(Action method) 現在兩行都會編譯,但它們之間有什麼區別? 謝謝 – Exulted