visual valid remarks generate example documentacion cref comment comentarios c# .net linq generics func

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);