2009-06-03 7 views
10

En regardant les signatures pour les délégués et Func Converter,Quelle est la différence entre Func <T, TResult> et Converter <TInput, TOutput>?

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

Je me bats pour voir la différence entre les deux. Sûrement, si nous renommons les arguments de type génériques, ils équivalent essentiellement à la même chose? Est-ce que quelqu'un peut expliquer pourquoi ils existent tous les deux, s'il vous plaît?

Répondre

17

Il n'y a pas de différence. La raison de leur existence est historique. Converter<T1,T2> était déjà disponible dans .NET 2.0, mais toute une série de types de délégués Func<> ont été ajoutés plus tard. Pour la cohérence, Func<T,TResult> a été ajouté, mais il a fait la même chose que Converter<T1,T2>.

+0

Vous avez reçu la réponse correcte puisque vous êtes le plus rapide des pistolets de l'ouest :) –

6

Converter<,> a été ajouté dans .NET 2.0. Les divers Func ont été ajoutés en 3.5 (je pense). Maintenant, bien sûr, les concepteurs pourraient ont dit "Hey, nous avons déjà un délégué générique pour cela", mais il aurait semblé très étrange d'avoir tous les autres Func s et pas celui-ci. Et pour éviter un changement de rupture Converter doit être laissé en place.

8

Il y a beaucoup de types de délégués qui sont effictively même - par exemple:

  • ThreadStart
  • MethodInvoker
  • Action

tous ont la même signature void Foo(). Historiquement, les noms ont été choisis par l'usage spécifique; mais avec LINQ et en regardant vers l'avant, il semble plus clair de se concentrer sur la signature - donc dans .NET 3.5, ils ont introduit des choses comme Func<...> et Action<...> (familles des délégués)

Malheureusement, ils ne sont pas vraiment compatibles à la variance niveau, donc si vous utilisez les deux vous aurez souvent besoin de caler entre eux. Qui est une douleur ...

Questions connexes