Func <t,tresult =“”>和Converter <tinput,toutput =“”>之间有什么区别?</tinput,> </t,>

时间:2009-06-03 10:03:34

标签: c# delegates

查看Func和Converter代理的签名,

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

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

有人可以解释为什么它们都存在吗?

3 个答案:

答案 0 :(得分:17)

没有区别。它们存在的原因是历史性的。 Converter<T1,T2>已在.NET 2.0中提供,但稍后添加了一系列Func<>个委托类型。为了保持一致性,添加了Func<T,TResult>,但它与Converter<T1,T2>完全相同。

答案 1 :(得分:8)

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

  • ThreadStart
  • MethodInvoker
  • Action

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

不幸的是,它们在方差级别上并不真正兼容,因此如果您同时使用它们,则通常需要在它们之间进行填充。这是一种痛苦......

答案 2 :(得分:6)

在.NET 2.0中添加了

Converter<,>。 3.5中添加了各种Func(我认为)。现在,当然,框架设计者可以说“嘿,我们已经有了一个通用代表”,但是拥有所有其他Func s看起来很奇怪而不是这一个。为避免重大变更,Converter必须留在原地。