La Func
famille de délégués (ou Action
d'ailleurs) n'est rien d'autre que de simples types de délégués déclarés comme
//.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. 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.
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)
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.
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.