Posso passar um método com um parâmetro out como um Func?
public IList<Foo> FindForBar(string bar, out int count) { }
// somewhere else
public IList<T> Find(Func<string, int, List<T>> listFunction) { }
O Func precisa de um tipo para que a saída não seja compilada lá, e chamar listFunction requer um int e não permitirá a entrada.
Existe uma maneira de fazer isso?
T
como contravariante eV
covariante. No entanto, como um parâmetro (output
) do tipoU
é passado por referência ,U
não pode ser marcado como co- ou contravariante e deve permanecer "invariante". Portanto, considerepublic delegate V MyDelegate<in T, U, out V>(T input, out U output);
se você usa C # 4 ou posterior.ref
parâmetro within
eout
parameters .Por que não criar uma classe para encapsular os resultados?
fonte
A
Func
família de delegados (ou,Action
nesse caso) não passa de simples tipos de delegados declarados comoetc. Os delegados, como tais, podem ter parâmetros out / ref, portanto, no seu caso, é apenas uma questão de implementação personalizada por você, como outras respostas indicaram. Por que a Microsoft não empacotou isso por padrão, pense no grande número de combinações necessárias.
por apenas dois parâmetros. Nós nem nos tocamos
ref
. Seria realmente complicado e confuso para os desenvolvedores.fonte
delegate TResult Func<T1, T2, TResult>(T1 obj, T2 obj)
edelegate TResult Func<T1, T2, TResult>(out T1 obj, T2 obj)
. Portanto, além do número de sobrecargas, o nome do símbolo é outro motivo pelo qual a Microsoft não pôde adicionar essas sobrecargasFunc
.Você poderia envolvê-lo em um lambda / delegate / function / method que expôs a interface correta e chamou FindForBar, mas eu suspeito que o FindForBar tenha contagem como parâmetro out como motivo, portanto, você deve ter certeza de que essas informações foram descartadas. ok / safe / desejável / teve os resultados corretos (você precisaria ter certeza disso, mesmo que pudesse passar diretamente diretamente para FindForBar).
fonte