Func sin parámetro

¿Puedo pasar un método con un parámetro out como Func?

public IList FindForBar(string bar, out int count) { } // somewhere else public IList Find(Func<string, int, List> 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?

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 input, out U output); 

¿Por qué no crear una clase para encapsular los resultados?

 public class Result { public IList List { get; set; } public Int32 Count { get; set; } } 

La familia de delegates de Func (o Action para ese asunto) no son más que simples tipos de delegates declarados como

 //.NET 4 and above public delegate TResult Func() public delegate TResult Func(T obj) //.NET 3.5 public delegate TResult Func(T1 obj1, T2 obj2) public delegate TResult Func(T1 obj1, T2 obj2, T3 obj3) 

etc. Los delegates 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 obj1, T2 obj2) delegate TResult Func(out T1 obj1, T2 obj2) delegate TResult Func(T1 obj1, out T2 obj2) delegate TResult Func(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).