2015-05-29 21 views
0

我寫的一些日誌記錄代碼,我不得不調用兩種方法具有相同簽名:C#函數式編程:不能引用方法,需要新的行動()

void Error(string, Exception) 
void Warn(string, Exception) 

我決定解決這個函數式編程而不是if/else。我有一個bool wasHandled來確定調用哪個方法。我想:

不能選擇從方法組方法:

Action<string, Exception> logAction = wasHandled ? _logger.Warn : _logger.Error; 

但是,編譯器/智能感知與抱怨。你打算採用這種方法嗎?

相反,我不得不把它寫這樣的:

var logAction = wasHandled ? new Action<string, Exception>(_logger.Warn) : _logger.Error; 

我得到的var的獎金,但我真的很討厭,我必須明確地調用new Action....

爲什麼前者不起作用?

+2

[這個問題的答案可能有幫助](http://stackoverflow.com/questions/6015747/why-does-funcbool-test-value-ff-not-compile)它不完全相同,但它是一個類似的問題。 –

+0

@MatthewWatson很遺憾,問題在中途改變了(從'var'到'Func <>'),所以響應是混合的。 – xanatos

+0

請注意,你甚至可以寫'var logAction = wasHandled? (Action )_logger.Warn:_logger.Error;',所以使用cast而不是構造函數(生成的代碼沒有真正的區別) – xanatos

回答

0

這是行不通的原因_logger.Warn的類型是方法組

與許多函數式語言不同,C#有方法(函數)重載,所以MethodName可以表示具有不同簽名但具有相同名稱的任何方法。

也許C#編譯器可以通過特殊的方式處理這種情況,但事實並非如此。

相關問題