Yang lain telah menunjukkan bahwa ada banyak kemungkinan tipe delegasi yang dapat Anda maksudkan; apa yang begitu istimewa tentang Func
hal itu yang layak dijadikan standar alih-alih Predicate
atau Action
atau segala kemungkinan lain? Dan, untuk lambdas, mengapa jelas bahwa tujuannya adalah untuk memilih bentuk delegasi, daripada bentuk pohon ekspresi?
Tetapi kita dapat mengatakan bahwa Func
itu istimewa, dan bahwa jenis lambda atau metode anonim yang disimpulkan adalah Fungsi dari sesuatu. Kami masih memiliki semua jenis masalah. Jenis apa yang ingin Anda simpulkan untuk kasus-kasus berikut?
var x1 = (ref int y)=>123;
Tidak ada Func<T>
tipe yang membutuhkan referensi apa pun.
var x2 = y=>123;
Kami tidak tahu jenis parameter formal, meskipun kami tahu pengembaliannya. (Atau apakah kita? Apakah return int? Long? Short? Byte?)
var x3 = (int y)=>null;
Kami tidak tahu tipe pengembalian, tetapi tidak bisa dibatalkan. Jenis pengembalian dapat berupa jenis referensi atau jenis nilai yang dapat dibatalkan.
var x4 = (int y)=>{ throw new Exception(); }
Sekali lagi, kita tidak tahu tipe pengembalian, dan kali ini bisa batal.
var x5 = (int y)=> q += y;
Apakah itu dimaksudkan sebagai pernyataan lambda yang batal atau sesuatu yang mengembalikan nilai yang ditugaskan ke q? Keduanya legal; mana yang harus kita pilih?
Sekarang, Anda mungkin berkata, yah, hanya saja tidak mendukung semua fitur itu. Hanya mendukung kasus "normal" di mana jenis dapat dikerjakan. Itu tidak membantu. Bagaimana hal itu membuat hidup saya lebih mudah? Jika fitur ini bekerja kadang-kadang dan kadang-kadang gagal maka saya masih harus menulis kode untuk mendeteksi semua situasi kegagalan itu dan memberikan pesan kesalahan yang berarti untuk masing-masing. Kami masih harus menentukan semua perilaku itu, mendokumentasikannya, menulis tes untuk itu, dan sebagainya. Ini adalah fitur yang sangat mahal yang menghemat pengguna mungkin setengah lusin penekanan tombol. Kami memiliki cara yang lebih baik untuk menambahkan nilai pada bahasa daripada menghabiskan banyak waktu untuk menulis kasus uji untuk fitur yang tidak berfungsi separuh waktu dan tidak memberikan manfaat apa pun dalam kasus di mana ia berfungsi.
Situasi di mana itu sebenarnya berguna adalah:
var xAnon = (int y)=>new { Y = y };
karena tidak ada tipe yang "bisa bicara" untuk hal itu. Tapi kami memiliki masalah ini sepanjang waktu, dan kami hanya menggunakan inferensi tipe metode untuk menyimpulkan tipe:
Func<A, R> WorkItOut<A, R>(Func<A, R> f) { return f; }
...
var xAnon = WorkItOut((int y)=>new { Y = y });
dan sekarang inferensi tipe metode berhasil apa tipe func.
Func<>
menerima hingga 16 argumen.