查看Func和Converter代理的签名,
public delegate TResult Func<T, TResult>(T arg);
public delegate TOutput Converter<TInput, TOutput>(TInput input);
我很难看到两者之间的区别。当然,如果我们重命名泛型类型的参数,它们基本上是相同的东西?
有人可以解释为什么它们都存在吗?
答案 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)
Converter<,>
。 3.5中添加了各种Func
(我认为)。现在,当然,框架设计者可以说“嘿,我们已经有了一个通用代表”,但是拥有所有其他Func
s看起来很奇怪而不是这一个。为避免重大变更,Converter
必须留在原地。