c# - valid - Func<T> sin parámetro
remarks c# (4)
¿Puedo pasar un método con un parámetro out 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 no se compile allí, y llamar a listFunction requiere un int y no permitirá una entrada.
¿Hay alguna forma de hacer esto?
¿Por qué no crear una clase para encapsular los resultados?
public class Result
{
public IList<Foo> List { get; set; }
public Int32 Count { get; set; }
}
La familia de delegados de Func
(o Action
para ese asunto) 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)
etc. Los delegados como tales pueden 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)
para solo dos parámetros Ni siquiera hemos tocado ref
. En realidad, sería engorroso y confuso para los desarrolladores.
Podrías envolverlo en un lambda / delegate / función / método que expuso la interfaz correcta y llamó a FindForBar, pero sospecho que FindForBar ha contado como un parámetro de salida como una razón, por lo que deberías estar seguro de que arrojar esa información era ok / safe / desirable / tenía los resultados correctos (tendrías que estar seguro de esto incluso si pudieras pasar directamente en FindForBar).
ref
y out
no son parte de la definición de parámetro de tipo, por lo que no puede usar el delegado incorporado de Func
para pasar out
argumentos de ref
y out
. Por supuesto, puede declarar su propio delegado si lo desea:
delegate V MyDelegate<T,U,V>(T input, out U output);