Func
Delegeler (veya ailesi Action
bu konuda) başka bir şey gibi ilan basit temsilci türleridir
//.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)
Bu şekilde delegeler dışarı / ref parametrelerine sahip olabilirler, bu nedenle sizin durumunuzda, diğer cevapların işaret ettiği gibi yalnızca kendiniz için özel bir uygulama söz konusudur. Microsoft'un bunu neden varsayılan olarak paketlemediğine gelince, gerektireceği çok sayıda kombinasyon düşünün.
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)
sadece iki parametre için. Dokunmadık bile ref
. Aslında geliştiriciler için hantal ve kafa karıştırıcı olurdu.
T
kontravaryant veV
kovaryant olarak işaretlemek mümkündür . Bununla birlikte,output
türdeki bir parametre ( ) referansU
olarak iletildiğinden , birlikte veya karşıt değişken olarak işaretlenemez ve "değişmez" olarak kalmalıdır. Bu yüzden C # 4 veya üstünü kullanıyorsanız düşünün .U
public delegate V MyDelegate<in T, U, out V>(T input, out U output);