2009-06-03 15 views
10

Mit Blick auf die Unterschriften für die Func und Converter DelegiertenWas ist der Unterschied zwischen Func <T, TResult> und Konverter <TInput, TOutput>?

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

ich kämpfen, um den Unterschied zwischen den beiden zu sehen. Sicher, wenn wir die Argumente des generischen Typs umbenennen, sind sie im Grunde dasselbe.

Kann jemand erklären, warum sie beide existieren, bitte?

Antwort

17

Es gibt keinen Unterschied. Der Grund für ihre Existenz ist historisch. Converter<T1,T2> war bereits in .NET 2.0 verfügbar, aber eine ganze Reihe von Func<> Delegattypen wurden später hinzugefügt. Für die Konsistenz wurde Func<T,TResult> hinzugefügt, aber es tat das gleiche wie Converter<T1,T2>.

+0

Ausgezeichnet die richtige Antwort für Sie, da Sie die schnellste Waffe im Westen sind :) –

6

Converter<,> wurde in .NET 2.0 hinzugefügt. Die verschiedenen Func s wurden in 3.5 hinzugefügt (glaube ich). Nun, sicher, die Framework-Designer konnten haben gesagt "Hey, wir haben bereits einen generischen Delegierten für diese", aber es wäre sehr seltsam ausgesehen haben alle anderen Func s und nicht diese. Und um eine Bruchänderung zu vermeiden, muss Converter an Ort und Stelle belassen werden.

8

Es gibt viele Delegattypen die effictively gleich sind - zum Beispiel:

  • ThreadStart
  • MethodInvoker
  • Action

haben alle die gleiche void Foo() Signatur. Historisch wurden die Namen durch die spezifische Verwendung ausgewählt; aber mit LINQ und auf der Suche nach vorn, so scheint es klarer über die Unterzeichnung zu konzentrieren - also in .NET 3.5 führten sie Dinge wie Func<...> und Action<...> (Familien der Delegierten)

Leider sind sie nicht wirklich kompatibel zu der Varianz Ebene, also wenn Sie beide verwenden, müssen Sie häufig zwischen ihnen shim. Was ist ein Schmerz ...

Verwandte Themen