Func
Rodzina delegatów (lub Action
dla tej sprawy) są tylko typy proste delegowanie jak deklarowane
//.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)
itp. 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.
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)
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.
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.