Func con parametro out

Posso passare un metodo con un parametro out come Func?

public IList FindForBar(string bar, out int count) { } // somewhere else public IList Find(Func<string, int, List> listFunction) { } 

Func ha bisogno di un tipo così fuori non verrà compilato lì, e chiamare listFunction richiede un int e non permetterà un out in.

C’è un modo per fare questo?

ref e out non fanno parte della definizione del parametro type, quindi non è ansible utilizzare il delegato Func incorporato per passare out argomenti ref e out . Naturalmente, puoi dichiarare il tuo delegato se lo desideri:

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

Perché non creare una class per incapsulare i risultati?

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

La famiglia Func di delegati (o Action per quella materia) non sono altro che semplici tipi delegati dichiarati come

 //.NET 4 and above public delegate TResult Func() public delegate TResult Func(T obj) //.NET 3.5 public delegate TResult Func(T1 obj1, T2 obj2) public delegate TResult Func(T1 obj1, T2 obj2, T3 obj3) 

ecc. I delegati in quanto tali possono avere parametri out / ref, quindi nel tuo caso è solo una questione di implementazione personalizzata da te stesso come hanno sottolineato altre risposte. Per quanto riguarda il motivo per cui Microsoft non l’ha compresso per impostazione predefinita, pensa al numero di combinazioni che richiederebbe.

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

solo per due parametri. Non abbiamo nemmeno toccato il ref . Sarebbe davvero ingombrante e confuso per gli sviluppatori.

Potresti racchiuderlo in un metodo lambda / delegate / function / che espone l’interfaccia giusta e chiama FindForBar, ma sospetto che FindForBar abbia come parametro un parametro out, quindi dovresti assicurarti di buttare via queste informazioni ok / sicuro / desiderabile / ha avuto i risultati giusti (dovresti essere sicuro di questo anche se potresti passare direttamente in FindForBar).