El Func
familia de los delegados (o Action
para el caso) no son más que simples tipos de delegado 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)
etc. Delegados como tal, puede tener parámetros out/ref, por lo que en su caso solo es una cuestión de implementación personalizada, como lo han señalado otras respuestas. En cuanto a por qué Microsoft no empaquetó 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 hemos tocado ref
. En realidad, sería engorroso y confuso para los desarrolladores.
En caso de que alguien más esté confundido como yo, no * tiene * que llamar a su delegado "Func" como los integrados ... – Dunc
@Dunc - Solucionado. Hubiera estado realmente confundido si no fuera por tu comentario. –
En C# 4 (2010) y posterior (no se publicó cuando escribió su respuesta) es posible marcar 'T' como contravariante, y' V' como covariante. Sin embargo, dado que un parámetro ('output') de tipo' U' se pasa *** por la referencia ***, 'U' no se puede marcar co o contravariante y debe permanecer como" invariante ". Por lo tanto, considere 'delegado público V MyDelegate (T input, out U output);' si usa C# 4 o posterior. –