2009-06-03 7 views
10

Func <T, TResult>とConverter <TInput、TOutput>の違いは何ですか? Funcとコンバーター代表団のための署名を見ると

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

は、私は2つの違いを見るために苦労しています。確かに、ジェネリック型引数の名前を変更すると、基本的に同じものになります。

誰もがなぜ存在するのか説明できますか?

答えて

17

違いはありません。彼らの存在理由は歴史的です。 Converter<T1,T2>はすでに.NET 2.0で使用できましたが、後でFunc<>デリゲートタイプの全範囲が追加されました。一貫性のためにFunc<T,TResult>が追加されましたが、それはConverter<T1,T2>と同じことをしました。

+0

あなたが西で最も速い銃であるため、正しい答えが与えられました:) –

6

Converter<,>が.NET 2.0で追加されました。さまざまなFuncが3.5で追加されました(私は思う)。確かに、フレームワークデザイナーが "これは一般的な代議員がいます"と言っているかもしれませんが、これ以外のFuncを持つのは非常に奇妙です。そして、改ざんを避けるためには、Converterを残しておく必要があります。

8

同じeffictively あるデリゲートの種類がたくさんあるが - 例えば:

  • ThreadStart
  • MethodInvoker
  • Action

すべて同じvoid Foo()署名を持っています。歴史的に、名前は特定の用途によって選ばれました。しかし、LINQと探して転送し、署名に集中するより明確なようだ - したがって、.NET 3.5で、彼らはFunc<...>Action<...>家族代表者の)のようなものを導入

残念ながら、彼らは分散で本当に互換性がありませんあなたは両方を使用している場合は、しばしばそれらの間にシムを持っている必要があります。これは痛みです...

関連する問題