La Func
famiglia dei delegati (o Action
per questo) non sono altro che semplici tipi delegato dichiarati come
//.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)
ecc delegati in quanto tale può avere parametri out/ref, quindi nel tuo caso è solo una questione di implementazione personalizzata da te stesso come hanno sottolineato altre risposte. Per quanto riguarda il motivo per cui Microsoft non l'ha compresso per impostazione predefinita, pensa al numero di combinazioni che richiederebbe.
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)
per soli due parametri. Non abbiamo nemmeno toccato ref
. Sarebbe davvero ingombrante e confuso per gli sviluppatori.
Nel caso in cui qualcun altro sia confuso come me, non è necessario * chiamare * il proprio delegato "Func" come quelli interni ... – Dunc
@Dunc - Corretto. Sarei stato davvero confuso se non fosse stato per il tuo commento. –
In C# 4 (2010) e versioni successive (non è stato rilasciato quando hai scritto la tua risposta) è possibile contrassegnare "T" come controvariante e "V" come covariante. Tuttavia, poiché un parametro ('output') di tipo' U' viene passato *** per riferimento ***, 'U' non può essere contrassegnato co- o controvariante e deve rimanere" invariante ". Quindi considera 'delegato pubblico V MyDelegate (input T, output U out);' se usi C# 4 o successivo. –