2011-11-01 9 views
7

En .NET 4.0, tiene un método delegado incorporada:favor explicar acerca de Func delegado en .NET 4.0

public delegate TResult Func<in T, out TResult>(T arg); 

Se utiliza en métodos extesion LINQ, ejemplo:

IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate); 

I no entienden con claridad sobre Func delegado, ¿por qué no coincide con la siguiente expresión lambda que:

// p is a XElement object 
p=>p.Element("firstname").Value.StartsWith("Q") 

Respuesta

12

Func<T,TResult> simplemente significa: un método que acepta un T como parámetro, y devuelve un TResult. Su lambda coincide, en que para T=XElement y TResult=bool, su lambda toma un T y devuelve un TResult. En ese caso particular, comúnmente se lo denominaría predicado. El compilador puede inferir los argumentos de tipo genérico (T y TResult) según el uso en muchos (no todos) escenarios.

Nota del in y out se refieren a la (co | contra) el comportamiento del método -variance - no el uso normal de de out (es decir out aquí no decir con-ref, no se supone que es asignado en llamada, y debe asignarse antes de la salida).

+0

Si cambia la palabra 'método' para funcionar en este contexto, estaré de acuerdo con su respuesta y la votaré por encima. –

+3

@Lajos no, sería ** incorrecto ** hacer eso; C# en particular * no tiene * funciones; un delegado como 'Func ' se une a ** method **. –

+0

Bueno, puede crear módulos donde puede agregar funciones que no son parte de ninguna clase, por lo tanto, C# también tiene funciones, no solo métodos. Estoy casi seguro (pero no probé) de que una función en un módulo puede ser un predicado. Sin embargo, podría estar equivocado en la segunda parte de este comentario. –

5

Func<T,TResult> ta kes dos parámetros genéricos: T y TResult. Como se puede ver, T es el tipo para el parámetro arg y TResult es el tipo de retorno, por lo tanto, su código

// p is a XElement object 
p=>p.Element("firstname").Value.StartsWith("Q") 

Será un Func<XElement, bool> válida.

Los modificadores genéricos in y out significan que los parámetros son contravariantes o covariantes.

+1

Y el truco de magia es que .NET usa [type inference] (http://en.wikipedia.org/wiki/Type_inference) para averiguar el tipo de 'T' y' TResult'. Por lo tanto, automáticamente infiere 'T' del tipo de' p', y 'TResult' del valor de resultado' StartsWith ("Q") '(booleano). –

+0

¡Eso exactamente! Como señala Marc, un delegado que devuelve un 'booleano' se conoce comúnmente como predicado – Connell