Bisakah saya meneruskan metode dengan parameter keluar sebagai Fungsi?
public IList<Foo> FindForBar(string bar, out int count) { }
// somewhere else
public IList<T> Find(Func<string, int, List<T>> listFunction) { }
Func membutuhkan tipe sehingga out tidak dapat dikompilasi di sana, dan memanggil listFunction membutuhkan int dan tidak akan mengizinkan masuk.
Apakah ada cara untuk melakukan ini?
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.ref
parameter denganin
danout
parameter .Mengapa tidak membuat kelas untuk merangkum hasilnya?
sumber
The
Func
keluarga delegasi (atauAction
dalam hal ini) tidak lain hanyalah jenis delegasi sederhana dinyatakan sepertidll. 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.
hanya untuk dua parameter. Kami bahkan belum menyentuh
ref
. Ini sebenarnya akan merepotkan dan membingungkan bagi pengembang.sumber
delegate TResult Func<T1, T2, TResult>(T1 obj, T2 obj)
dandelegate TResult Func<T1, T2, TResult>(out T1 obj, T2 obj)
. Jadi selain jumlah nama simbol kelebihan adalah alasan lain mengapa Microsoft tidak bisa menambahkan kelebihan iniFunc
.Anda bisa membungkusnya dalam lambda / delegate / function / method yang mengekspos antarmuka yang tepat dan bernama FindForBar, tetapi saya menduga bahwa FindForBar telah menghitung sebagai parameter sebagai alasan, jadi Anda harus yakin membuang informasi itu tadinya ok / aman / diinginkan / memiliki hasil yang tepat (Anda harus yakin akan hal ini bahkan jika Anda bisa langsung lulus di FindForBar).
sumber