Czy mogę przekazać metodę z parametrem out jako Func?
public IList<Foo> FindForBar(string bar, out int count) { }
// somewhere else
public IList<T> Find(Func<string, int, List<T>> listFunction) { }
Func potrzebuje typu, więc out nie zostanie tam skompilowany, a wywołanie listFunction wymaga int i nie pozwoli na wyjście.
Czy jest na to sposób?
T
jako kontrawariantne iV
jako kowariantne. Jednak ponieważ parametr (output
) typuU
jest przekazywany przez odwołanie ,U
nie może być oznaczony jako współ- lub kontrawariantny i musi pozostać „niezmienny”. Rozważ więc,public delegate V MyDelegate<in T, U, out V>(T input, out U output);
czy używasz C # 4 lub nowszego.ref
parametru z parametramiin
iout
.Dlaczego nie utworzyć klasy, która będzie zawierać wyniki?
źródło
Func
Rodzina delegatów (lubAction
dla tej sprawy) są tylko typy proste delegowanie jak deklarowaneitp. Delegaci jako tacy mogą mieć parametry out / ref, więc w twoim przypadku jest to tylko kwestia samodzielnej implementacji, jak wskazały inne odpowiedzi. Jeśli chodzi o to, dlaczego Microsoft nie zapakował tego domyślnie, pomyśl o samej liczbie kombinacji, których wymagałby.
tylko dla dwóch parametrów. Nawet się nie dotknęliśmy
ref
. W rzeczywistości byłoby to kłopotliwe i mylące dla programistów.źródło
delegate TResult Func<T1, T2, TResult>(T1 obj, T2 obj)
idelegate TResult Func<T1, T2, TResult>(out T1 obj, T2 obj)
. Więc oprócz liczby przeciążeń nazwa symbolu jest kolejnym powodem, dla którego firma Microsoft nie mogła dodać tych przeciążeńFunc
.Możesz umieścić to w lambda / delegate / function / method, która ujawnia właściwy interfejs i nazywa się FindForBar, ale podejrzewam, że FindForBar liczy się jako parametr out jako powód, więc musisz być pewien, że wyrzucenie tej informacji było ok / bezpieczny / pożądany / miał właściwe wyniki (musiałbyś być tego pewien, nawet jeśli możesz po prostu przekazać bezpośrednio w FindForBar).
źródło