La Func
familia de delegados (o Action
para el caso) no son más que simples tipos de delegados declarados como
//.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)
Los delegados como tales pueden tener parámetros out / ref, por lo que en su caso es solo una cuestión de implementación personalizada por usted mismo, como lo han señalado otras respuestas. En cuanto a por qué Microsoft no empacó esto por defecto, piense en la gran cantidad de combinaciones que requeriría.
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)
por solo dos parámetros. Ni siquiera nos hemos tocado ref
. En realidad, sería engorroso y confuso para los desarrolladores.
T
como contravariante yV
como covariante. Sin embargo, dado que un parámetro (output
) de tipoU
se pasa por referencia ,U
no se puede marcar como co o contravariante y debe permanecer "invariante". Así que considerepublic delegate V MyDelegate<in T, U, out V>(T input, out U output);
si usa C # 4 o posterior.