La Funcfamille de délégués (ou Actiond'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.
Tcomme contravariant etVcomme covariant. Cependant, comme un paramètre (output) de typeUest passé par référence ,Uil 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.