10

Ho la seguente funzione di ordine superiore:argomenti di tipo non può essere dedotta dal l'utilizzo per la funzione di ordine superiore

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

E cercando di chiamarlo così:

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

Compiler mi dà "argomenti tipo non possono essere dedotti dall'errore" di utilizzo. ma le seguenti opere:

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

mi chiedo qual è la differenza? string.IsNullOrWhiteSpace è già una funzione non sovraccaricata con la stessa identica firma.

Come accennato nei commenti, i seguenti lavori anche e ancora non spiega perché l'inferenza di tipo non riesce in questo caso:

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

possibile duplicato di inferenza di tipo generico [C# 3.0 - passaggio di un delegato come parametro di funzione] (http://stackoverflow.com/questions/407983/c-sharp-3-0-generic-type-inference-passing- a-delegate-as-a-function-parameter) –

+6

IsNullOrWhiteSpace è un gruppo di metodi. Il gruppo metodo ha oggi solo un membro partecipante, ma potrebbe ottenere di più in futuro. –

risposta

6

I dettagli del problema con cui hai a che fare sono esauditi da Eric Lippe rt sul suo blog, here.

Fondamentalmente, come "David B" ha detto nei commenti, "IsNullOrWhiteSpace è un gruppo di metodi. Il gruppo metodo ha solo un membro partecipante oggi, ma potrebbe ottenere di più in futuro."

+0

Link impressionante. Il codice proposto funzionerebbe in C# 4.0? var isValidStr = LinqUtils.Not (string.IsNullOrWhiteSpace); –

+1

No, l'aggiornamento per eseguire il miglioramento dell'inferenza funziona solo per il tipo restituito. – payo

+0

No, non sembra funzionare in C# 4.0 :(Inoltre, 's => string.IsNullOrWhiteSpace (s)' non funziona o mi fa pensare che la spiegazione del "metodo di gruppo" non sia valida – Grozz

2

Questo funziona:

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

Anche se, Sembra che il il compilatore dovrebbe avere abbastanza informazioni per dedurre i parametri del tipo qui - e questo non dovrebbe essere richiesto ...

+0

Lo so. È essenzialmente la stessa della mia seconda parte. Mi chiedo perché l'inferenza di tipo non funzioni. – Grozz

+0

concordato. Molto strano. –

Problemi correlati