Puis-je passer une méthode avec un paramètre out comme Func?
public IList<Foo> FindForBar(string bar, out int count) { }
// somewhere else
public IList<T> Find(Func<string, int, List<T>> listFunction) { }
Func a besoin d'un type pour que out n'y soit pas compilé, et l'appel de listFunction nécessite un int et n'autorisera pas un out in.
Y a-t-il un moyen de faire cela?
T
comme contravariant etV
comme covariant. Cependant, comme un paramètre (output
) de typeU
est passé par référence ,U
il ne peut pas être marqué co- ou contravariant et doit rester "invariant". Considérez doncpublic delegate V MyDelegate<in T, U, out V>(T input, out U output);
si vous utilisez C # 4 ou une version ultérieure.ref
paramètre avec les paramètresin
etout
.Pourquoi ne pas créer une classe pour encapsuler les résultats?
la source
La
Func
famille de délégués (ouAction
d'ailleurs) n'est rien d'autre que de simples types de délégués déclarés commeetc. Les délégués en tant que tels peuvent avoir des paramètres out / ref, donc dans votre cas ce n'est qu'une question d'implémentation personnalisée par vous-même comme d'autres réponses l'ont souligné. Quant à savoir pourquoi Microsoft n'a pas emballé cela par défaut, pensez au nombre de combinaisons qu'il faudrait.
pour seulement deux paramètres. Nous n'avons même pas touché
ref
. Ce serait en fait encombrant et déroutant pour les développeurs.la source
delegate TResult Func<T1, T2, TResult>(T1 obj, T2 obj)
etdelegate TResult Func<T1, T2, TResult>(out T1 obj, T2 obj)
. Donc, outre le nombre de surcharges, le nom du symbole est une autre raison pour laquelle Microsoft n'a pas pu ajouter ces surcharges deFunc
.Vous pouvez l'envelopper dans un lambda / délégué / fonction / méthode qui a exposé la bonne interface et appelé FindForBar, mais je soupçonne que FindForBar a compté comme un paramètre out comme raison, vous devez donc être sûr de jeter ces informations ok / sûr / souhaitable / a eu les bons résultats (vous devez être sûr de cela même si vous pouvez simplement passer directement dans FindForBar).
la source