¿Puedo pasar un método con un parámetro de salida como Func?
public IList<Foo> FindForBar(string bar, out int count) { }
// somewhere else
public IList<T> Find(Func<string, int, List<T>> listFunction) { }
Func necesita un tipo para que out no se compile allí, y llamar a listFunction requiere un int y no permitirá una entrada.
¿Hay alguna forma de hacer esto?
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.ref
parámetro conin
y losout
parámetros .¿Por qué no crear una clase para encapsular los resultados?
fuente
La
Func
familia de delegados (oAction
para el caso) no son más que simples tipos de delegados declarados comoLos 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.
por solo dos parámetros. Ni siquiera nos hemos tocado
ref
. En realidad, sería engorroso y confuso para los desarrolladores.fuente
delegate TResult Func<T1, T2, TResult>(T1 obj, T2 obj)
ydelegate TResult Func<T1, T2, TResult>(out T1 obj, T2 obj)
. Por lo tanto, además del número de símbolo de sobrecargas, hay otra razón por la cual Microsoft no pudo agregar estas sobrecargasFunc
.Podría envolverlo en un método lambda / delegado / función / que expuso la interfaz correcta y llamó a FindForBar, pero sospecho que FindForBar cuenta como un parámetro de salida como una razón, por lo que debe asegurarse de tirar esa información ok / seguro / deseable / tuvo los resultados correctos (tendría que estar seguro de esto incluso si pudiera pasar directamente en FindForBar).
fuente