2009-06-03 19 views
10

En cuanto a las firmas de los delegados Func y convertidor,¿Cuál es la diferencia entre Func <T, TResult> y Converter <TInput, TOutput>?

public delegate TResult Func<T, TResult>(T arg); 
public delegate TOutput Converter<TInput, TOutput>(TInput input); 

estoy luchando para ver la diferencia entre los dos. Seguramente, si cambiamos el nombre de los argumentos de tipo genérico, ¿equivalen esencialmente a lo mismo?

¿Alguien puede explicar por qué ambos existen, por favor?

Respuesta

17

No hay diferencia. La razón de su existencia es histórica. Converter<T1,T2> ya estaba disponible en .NET 2.0, pero luego se agregaron todos los tipos de delegados Func<>. Por coherencia, se agregó Func<T,TResult>, pero hizo lo mismo que Converter<T1,T2>.

+0

Se le ha otorgado la respuesta correcta, ya que es el arma más rápida del oeste :) –

6

Converter<,> se añadió en .NET 2.0. Los diversos Func s se agregaron en 3.5 (creo). Ahora, claro, los diseñadores de frameworks pudieron haber dicho "Hey, ya tenemos un delegado genérico para esto", pero hubiera parecido muy extraño tener todos los otros Func y no este. Y para evitar un cambio de rotura, Converter debe dejarse en su lugar.

8

Hay un montón de tipos de delegado que son effictively la misma - por ejemplo:

  • ThreadStart
  • MethodInvoker
  • Action

todos tienen el mismo void Foo() firma. Históricamente, los nombres fueron elegidos por el uso específico; pero con LINQ y que miran hacia delante, parece más claro para centrarse en la firma - por lo tanto en .NET 3.5 introdujeron cosas como Func<...> y Action<...> ( familias de delegados)

Por desgracia, en realidad no son compatibles en la varianza nivel, por lo que si está utilizando ambos a menudo tendrá que calzar entre ellos. Que es un dolor ...

Cuestiones relacionadas