The Func
keluarga delegasi (atau Action
dalam hal ini) tidak lain hanyalah jenis delegasi sederhana dinyatakan seperti
//.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)
dll. Delegasi dapat memiliki parameter out / ref, jadi dalam kasus Anda ini hanya masalah implementasi kustom sendiri seperti yang ditunjukkan oleh jawaban lain. Mengenai mengapa Microsoft tidak mengemas ini secara default, pikirkan banyaknya kombinasi yang diperlukan.
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)
hanya untuk dua parameter. Kami bahkan belum menyentuh ref
. Ini sebenarnya akan merepotkan dan membingungkan bagi pengembang.
T
sebagai contravarian, danV
sebagai kovarian. Namun, karena parameter (output
) tipeU
dilewati oleh referensi ,U
tidak dapat ditandai co-atau contravarian dan harus tetap "invarian". Jadi pertimbangkanpublic delegate V MyDelegate<in T, U, out V>(T input, out U output);
jika Anda menggunakan C # 4 atau lebih baru.