La Func
famiglia dei delegati (o del Action
resto) non sono altro che semplici tipi di delegati dichiarati come
//.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)
ecc. I delegati in quanto tali possono avere parametri out / ref, quindi nel tuo caso è solo una questione di implementazione personalizzata da parte tua, come hanno sottolineato altre risposte. Per quanto riguarda il motivo per cui Microsoft non ha impacchettato questo per impostazione predefinita, pensa al semplice numero di combinazioni che richiederebbe.
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)
per solo due parametri. Non ci siamo nemmeno toccati ref
. In realtà sarebbe ingombrante e confuso per gli sviluppatori.
T
come contraddittorio eV
come covariante. Tuttavia, poiché un parametro (output
) di tipoU
viene passato per riferimento ,U
non può essere contrassegnato come co o contraddittorio e deve rimanere "invariante". Quindi considerapublic delegate V MyDelegate<in T, U, out V>(T input, out U output);
se usi C # 4 o versioni successive.