回答:
ref
そしてout
あなたは、ビルトインを使用することはできませんので、型パラメータ定義の一部ではないFunc
渡すデリゲートref
とout
引数を。もちろん、必要に応じて独自のデリゲートを宣言できます。
delegate V MyDelegate<T,U,V>(T input, out U output);
結果をカプセル化するクラスを作成してみませんか?
public class Result
{
public IList<Foo> List { get; set; }
public Int32 Count { get; set; }
}
Func
デリゲートのファミリー(またはAction
そのことについて)は、次のように宣言された単純なデリゲート型にすぎません
//.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パラメーターを持つことができるため、他の回答が指摘しているように、あなたの場合は自分でカスタム実装するだけの問題です。マイクロソフトがデフォルトでこれをパックしなかった理由については、必要な組み合わせの数を考えてみてください。
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
たことさえありません。実際には、開発者にとって煩雑で混乱を招くでしょう。
delegate TResult Func<T1, T2, TResult>(T1 obj, T2 obj)
とdelegate TResult Func<T1, T2, TResult>(out T1 obj, T2 obj)
。したがって、Microsoftがこれらのオーバーロードを追加できなかったもう1つの理由は、オーバーロードのシンボル名のほかにFunc
です。
T
、反変として、および共変としてマークすることができV
ます。ただし、output
タイプのパラメータ()は参照によってU
渡されるため、U
共変または反変としてマークすることはできず、「不変」のままである必要があります。したがって、public delegate V MyDelegate<in T, U, out V>(T input, out U output);
C#4以降を使用するかどうかを検討してください。