Func <T,TResult>和Converter <TInput,TOutput>之间有什么区别?

Pau*_*art 10 c# delegates

查看Func和Converter代理的签名,

public delegate TResult Func<T, TResult>(T arg);
public delegate TOutput Converter<TInput, TOutput>(TInput input);
Run Code Online (Sandbox Code Playgroud)

我很难看出两者之间的区别.当然,如果我们重命名泛型类型参数,它们基本上是相同的东西?

谁能解释为什么它们都存在呢?

Phi*_*ert 17

没有区别.它们存在的原因是历史性的.Converter<T1,T2>已经在.NET 2.0中可用,但Func<>后来添加了一系列代理类型.为了保持一致性,Func<T,TResult>添加了,但它做了同样的事情Converter<T1,T2>.


Mar*_*ell 8

有许多委托类型效率相同 - 例如:

  • ThreadStart
  • MethodInvoker
  • Action

都有相同的void Foo()签名.从历史上看,名称是根据具体用途选择的; 但是使用LINQ并向前看,专注于签名似乎更清晰 - 因此在.NET 3.5中他们引入了类似的东西Func<...>Action<...>(代表的家族)

不幸的是,它们在方差级别上并不真正兼容,所以如果你同时使用它们,你通常必须在它们之间进行填充.这是一种痛苦......


Aak*_*shM 6

Converter<,>在.NET 2.0中添加了.Func3.5中添加了各种s(我认为).现在,当然,框架设计师可以说"嘿,我们已经有了一个通用代表",但是拥有所有其他Funcs并且不是这个看起来很奇怪.并且为了避免重大变化,Converter必须留在原地.