Какая разница между 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
необходимо оставить на месте.