2009-08-15 8 views
134

outパラメータを含むメソッドをFuncとして渡すことはできますか?Func outパラメータなし

public IList<Foo> FindForBar(string bar, out int count) { } 

// somewhere else 
public IList<T> Find(Func<string, int, List<T>> listFunction) { } 

のFuncがコンパイルされませんので、アウトタイプを必要とし、呼び出しlistFunctionはint型を必要とし、でアウトを許可しません。

これを実行する方法はありますか?

答えて

192

refoutは、型パラメータ定義の一部ではありません。もちろん、あなたがしたい場合は、独自のデリゲートを宣言することができます。

delegate V MyDelegate<T,U,V>(T input, out U output); 
+13

誰かが私のように混乱している場合は、ビルトインのものと同じように代理人 "Func"に電話する必要はありません。 – Dunc

+0

@Dunc - 修正。私は本当にあなたのコメントにはそれが混乱していただろう。 –

+5

C#4(2010)以降(あなたの答えを書いたときにはリリースされていませんでした)では、反逆として「T」を、共変として「V」をマークすることができます。しかし、 'U'型のパラメータ( 'output')は参照***によって***に渡されるので、' U'は共変または反復的にマークすることはできず、「不変」のままでなければなりません。だから、もしあなたがC#4以降を使っているならば、 'Public Delegate V MyDelegate (T input、out U出力); –

19

なぜ結果をカプセル化するクラスを作成しないのですか?

public class Result 
{ 
    public IList<Foo> List { get; set; } 
    public Int32 Count { get; set; } 
} 
0

あなたは右のインターフェースを公開してFindForBarと呼ばれるラムダ/デリゲート/関数/メソッドでそれをラップすることができ、私はあなたがする必要があると思いますのでFindForBarが、その理由として、outパラメータとしてカウントしていると思われますその情報を離れて投げてもOK /安全/望ましい/正しい結果があったことを確認してください(あなたが直接FindForBarを渡すことができたとしても、これを確かめる必要があります)。あなたはrefout引数を渡すためにビルトインFuncデリゲートを使用することはできませんので

9

代表者(またはそのことについてAction)のFunc家族が

//.NET 4 and above 
public delegate TResult Func<out TResult>() 
public delegate TResult Func<in T, out TResult>(T obj) 

//.NET 3.5 
public delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2) 
public delegate TResult Func<T1, T2, T3, TResult>(T1 obj1, T2 obj2, T3 obj3) 

など各国代表のように宣言シンプルなデリゲートの種類に過ぎませんout/refパラメータを持つことができるので、あなたのケースでは、他の答えが指摘しているように、独自のカスタム実装の問題のみです。 Microsoftがデフォルトでこれを詰め込んでいない理由については、必要な組み合わせの数を考えてみてください。

delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2) 
delegate TResult Func<T1, T2, TResult>(out T1 obj1, T2 obj2) 
delegate TResult Func<T1, T2, TResult>(T1 obj1, out T2 obj2) 
delegate TResult Func<T1, T2, TResult>(out T1 obj1, out T2 obj2) 

ただ2つのパラメータです。我々はrefに触れていない。実際には開発者にとっては面倒で混乱します。

+1

C#関数のオーバーロードでは、代理TResult Func (T1 obj、T2 obj)および代理TResult Func (out T1 obj、T2 obj)を区別できません。したがって、オーバーロードのシンボル名の数に加えて、なぜMicrosoftがFuncのこれらのオーバーロードを追加できなかったのかの他の理由があります。 –

関連する問題