10

tengo la siguiente función de orden superior:argumentos de tipo no se pueden deducir a partir del uso de la función de orden superior

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

Y tratando de llamarlo así:

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

Compilador me da el error "no se pueden inferir los argumentos de tipo a partir del uso". pero las siguientes obras:

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

me preguntan cuál es la diferencia? string.IsNullOrWhiteSpace ya es una función no sobrecargada con exactamente la misma firma.

Como se mencionó en los comentarios, lo siguiente también funciona y todavía no explica por qué la inferencia de tipos fracasa en este caso:

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

posible duplicado de [C# 3.0 tipo genérico de inferencia - pasando un delegado como parámetro de función] (http://stackoverflow.com/questions/407983/c-sharp-3-0-generic-type-inference-passing- a-delegate-as-a-function-parameter) –

+6

IsNullOrWhiteSpace es un grupo de métodos. El grupo de métodos solo tiene un miembro participante hoy, pero podría obtener más en el futuro. –

Respuesta

6

Los detalles del problema que está tratando son respondidos por Eric Lippe rt en su blog, here.

Básicamente, como dijo "David B" en sus comentarios, "IsNullOrWhiteSpace es un grupo de métodos. El grupo de métodos solo tiene un miembro participante hoy, pero podría obtener más en el futuro".

+0

Enlace impresionante. ¿Debería el código propuesto funcionar en C# 4.0? var isValidStr = LinqUtils.Not (string.IsNullOrWhiteSpace); –

+1

No, la actualización a la mejora de inferencia de tipo solo funciona para el tipo de devolución. – payo

+0

No, no parece funcionar en C# 4.0 :(Además, 's => string.IsNullOrWhiteSpace (s)' tampoco funciona, por lo que creo que la explicación del "grupo de métodos" no es válida. – Grozz

2

Esto funciona:

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

Aunque, parece que la el compilador debería tener suficiente información para deducir los parámetros de tipo aquí, y esto no debería ser necesario ...

+0

Lo sé. Es esencialmente lo mismo que mi segunda parte. Me pregunto por qué la inferencia de tipo no funciona. – Grozz

+0

De acuerdo. Muy raro. –

Cuestiones relacionadas