Какая разница между Func <T, TResult> и Converter <TInput, TOutput>?

Глядя на подписи для делегатов Func и Converter,

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

Я изо всех сил стараюсь увидеть разницу между ними. Разумеется, если мы переименуем общие аргументы типа, они в основном равны одному и тому же?

Может кто-нибудь объяснить, почему они оба существуют, пожалуйста?

Ответ 1

Нет никакой разницы. Причина их существования - историческая. Converter<T1,T2> уже был доступен в .NET 2.0, но позже был добавлен целый ряд типов делегатов Func<>. Для согласованности добавлен Func<T,TResult>, но он сделал то же самое, что и Converter<T1,T2>.

Ответ 2

Существует много типов делегатов, которые являются эффектно одинаковыми - например:

  • ThreadStart
  • MethodInvoker
  • Action

все имеют одинаковую подпись void Foo(). Исторически имена были выбраны конкретным использованием; но с LINQ и, глядя вперед, кажется более четким сосредоточиться на сигнатуре, поэтому в .NET 3.5 они ввели такие вещи, как Func<...> и Action<...> (семейства делегатов)

К сожалению, они не очень совместимы на уровне дисперсии, поэтому, если вы используете оба, вам часто приходится прокладывать между ними. Это боль...

Ответ 3

Converter<,> был добавлен в .NET 2.0. Различные Func были добавлены в 3.5 (я думаю). Теперь, конечно, дизайнеры фреймворка могли бы сказать: "Эй, у нас уже есть общий делегат для этого", но было бы странно иметь все остальные Func, а не это. И чтобы избежать изменения разрыва, Converter необходимо оставить на месте.