2010-07-10 84 views
5

這是更多的C#語法問題,而不是需要解決的實際問題。假設我有一個將委託作爲參數的方法。比方說,我有以下方法確定:有什麼辦法直接使用C#方法作爲委託?

void TakeSomeDelegates(Action<int> action, Func<float, Foo, Bar, string> func) 
{ 
    // Do something exciting 
} 

void FirstAction(int arg) { /* something */ } 

string SecondFunc(float one, Foo two, Bar three){ /* etc */ } 

現在,如果我要打電話TakeSomeDelegatesFirstActionSecondFunc作爲參數,至於我可以告訴大家,我需要做的是這樣的:

TakeSomeDelegates(x => FirstAction(x), (x,y,z) => SecondFunc(x,y,z)); 

但有沒有更方便的方法來使用適合所需的委託簽名而不寫lambda的方法?理想情況下類似TakeSomeDelegates(FirstAction, SecondFunc),雖然顯然不能編譯。

+1

」雖然顯然不編譯「...應該編譯:) – porges 2010-07-10 07:47:21

+0

woops,我真的不知道我以前做錯了什麼,但它現在似乎工作得很好。我想這是一個非常愚蠢的問題:S – guhou 2010-07-10 07:51:10

+0

對不起,浪費你的時間傢伙...我也不確定什麼答案標記爲正確的......我應該刪除這個問題嗎? – guhou 2010-07-10 07:54:53

回答

4

你在找什麼叫什麼 'method groups'。與方法組替換後

TakeSomeDelegates(x => firstAction(x), (x, y, z) => secondFunc(x, y, z)); 

:有了這些,可以更換一個線lamdas,如:

TakeSomeDelegates(firstAction, secondFunc); 
+0

感謝您的回答!我會接受這個,因爲這個鏈接解釋了爲什麼這個工作:) – guhou 2010-07-10 07:56:50

1

編譯器將接受需要委託的方法組的名稱,只要它能夠確定選擇哪個超載,就不需要構建lambda表達式。什麼是你看到的確切的編譯器錯誤信息?

+0

請記住,它只能找出'in'參數,即它不能解決方法返回的類型:http://stackoverflow.com/questions/3203643/generic-methods-in-net-cannot-有他們的返回類型推斷爲什麼 – 2010-07-10 07:56:19

+0

由於您不能基於返回類型重載方法組,這不是問題。 (您可以在返回類型上重載'operator implicit'和'operator explicit',但這些不能被命名爲方法組)。 – 2010-07-10 09:14:56

2

只需跳過函數名稱的父元素。

 TakeSomeDelegates(FirstAction, SecondFunc); 

編輯:

FYI因爲括號是在VB可選的,他們有寫這個...

TakeSomeDelegates(AddressOf FirstAction, AddressOf SecondFunc) 
0

是它被稱爲方法組,和更精確的實施例那是......

static void FirstAction(int arg) { /* something */ } 

static string SecondFunc(float one, Foo two, Bar three) { return ""; } 


Action<int> act1 = FirstAction; 
Func<float, Foo, Bar, string> act2 = SecondFunc; 


TakeSomeDelegates(firstAction, secondFunc); 

這樣你可以使用方法組。 「

相關問題