10

我有以下高階函數:類型參數不能從使用的高階函數推斷

public static Func<T, bool> Not<T>(Func<T, bool> otherFunc) 
{ 
    return arg => !otherFunc(arg); 
} 

,並試圖把它像:

var isValidStr = LinqUtils.Not(string.IsNullOrWhiteSpace); 

編譯給我「類型參數不能從使用推斷」的錯誤。 但以下工作:

var isValidStr = LinqUtils.Not((string s) => string.IsNullOrWhiteSpace(s)); 

我不知道有什麼區別? string.IsNullOrWhiteSpace已經是一個具有完全相同簽名的非重載函數。

正如在評論中提到,下面還工作,仍然沒有解釋爲什麼類型推斷在這種情況下失敗:

var isValidStr = LinqUtils.Not<string>(string.IsNullOrWhiteSpace); 
+1

[C#3.0泛型類型推斷 - 將委託作爲函數參數傳遞]的可能重複(http://stackoverflow.com/questions/407983/c-sharp-3-0-generic-type-in​​ference-passing- a-delegate-as-a-function-parameter) –

+6

IsNullOrWhiteSpace是一個方法組。方法小組今天只有一個參與成員,但未來可能會有更多。 –

回答

6

你正在處理的問題的細節由Eric Lippe rt在他的博客上,here

基本上,正如「David B」在您的評論中所說:「IsNullOrWhiteSpace是一個方法組,今天只有一個參與成員,但未來可能會獲得更多成果。

+0

真棒鏈接。建議的代碼可以在C#4.0中工作嗎? var isValidStr = LinqUtils.Not(string.IsNullOrWhiteSpace); –

+1

不,升級類型推斷改進僅適用於返回類型。 – payo

+0

不,它似乎不工作在C#4.0 :(另外,'s => string.IsNullOrWhiteSpace(s)'不起作用,或者使我認爲「方法組」說明無效。 – Grozz

2

這工作:

var isValidStr = Not<string>(string.IsNullOrWhiteSpace); 

雖然,這似乎是編譯器應該有足夠的信息來推斷這裏的類型參數 - 這不應該被要求...

+0

我知道。這與我的第二部分基本相同。我想知道爲什麼類型推斷不起作用。 – Grozz

+0

同意。很奇怪。 –

相關問題