Func <T>パラメータなし


167

Funcとして出力パラメーターを持つメソッドを渡すことはできますか?

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

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

Funcには型が必要なので、outはそこでコンパイルされません。listFunctionを呼び出すにはintが必要で、out inは許可されません。

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

回答:


228

refそしてoutあなたは、ビルトインを使用することはできませんので、型パラメータ定義の一部ではないFunc渡すデリゲートrefout引数を。もちろん、必要に応じて独自のデリゲートを宣言できます。

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

7
C#4(2010)以降では(回答を書き込んでもリリースされていません)T、反変として、および共変としてマークすることができVます。ただし、outputタイプのパラメータ()は参照によってU渡されるためU共変または反変としてマークすることはできず、「不変」のままである必要があります。したがって、public delegate V MyDelegate<in T, U, out V>(T input, out U output);C#4以降を使用するかどうかを検討してください。
Jeppe Stig Nielsen


24

結果をカプセル化するクラスを作成してみませんか?

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

13

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たことさえありません。実際には、開発者にとって煩雑で混乱を招くでしょう。


2
C#の関数のオーバーロードを区別できないことに注意してくださいdelegate TResult Func<T1, T2, TResult>(T1 obj, T2 obj)delegate TResult Func<T1, T2, TResult>(out T1 obj, T2 obj)。したがって、Microsoftがこれらのオーバーロードを追加できなかったもう1つの理由は、オーバーロードのシンボル名のほかにFuncです。
Kasper van den Berg

上記のデリゲートに関するMSDNの記事を誰かに紹介してもらえますか?
Su Llewellyn

@SuLlewellyn私は、元のMSDNの記事を見つけるcouldntのが、あなたは試みることができる:docs.microsoft.com/en-us/dotnet/api/...docs.microsoft.com/en-us/dotnet/api/...
nawfal

0

正しいインターフェイスを公開してFindForBarを呼び出すlambda / delegate / function / methodでそれをラップすることもできますが、FindForBarが理由として出力パラメーターとしてカウントされているのではないかと思います。 ok / safe / desirable /正しい結果が得られました(FindForBarを直接渡すだけの場合でも、これを確認する必要があります)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.