Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Ada beberapa kesalahan yang terkait dengan mendeklarasikan dan menggunakan ekspresi lambda:
- CS0748: Penggunaan parameter lambda yang tidak konsisten; jenis parameter harus semua eksplisit atau semua implisit.
- CS1621: Pernyataan hasil tidak dapat digunakan di dalam metode anonim atau ekspresi lambda.
-
CS1628: Tidak dapat menggunakan
inrefatauoutparameter di dalam metode anonim, ekspresi lambda, atau ekspresi kueri. - CS1632: Kontrol tidak dapat meninggalkan isi metode anonim atau ekspresi lambda.
- CS1673: Metode anonim, ekspresi lambda, dan ekspresi kueri di dalam struktur tidak dapat mengakses anggota instans 'ini'.
- CS1686: Variabel lokal atau anggotanya tidak dapat mengambil alamat mereka dan digunakan di dalam metode anonim atau ekspresi lambda.
- CS1706: Ekspresi tidak boleh berisi metode anonim atau ekspresi lambda.
- CS8030: Fungsi anonim yang dikonversi menjadi delegasi pengembali void tidak dapat mengembalikan nilai.
- CS8175: Tidak dapat menggunakan ref local di dalam metode anonim, ekspresi lambda, atau ekspresi kueri.
- CS8916: Atribut pada ekspresi lambda memerlukan daftar parameter yang dikurung.
- CS8971: InterpolatedStringHandlerArgument tidak berpengaruh ketika diterapkan ke parameter lambda dan akan diabaikan di situs panggilan.
-
CS8975: Kata kunci
varkontekstual tidak dapat digunakan sebagai jenis pengembalian lambda eksplisit. - CS9098: Parameter lambda yang ditik secara implisit '...' tidak dapat memiliki nilai default.
Selain itu, ada beberapa peringatan yang terkait dengan mendeklarasikan dan menggunakan ekspresi lambda:
- CS8971: InterpolatedStringHandlerArgument tidak berpengaruh ketika diterapkan ke parameter lambda dan akan diabaikan di situs panggilan.
- CS9099: Nilai parameter default tidak cocok dalam jenis delegasi target.
- CS9100: Parameter memiliki pengubah param dalam lambda tetapi tidak dalam jenis delegasi target.
Pengkompilasi juga menghasilkan pesan informasi berikut:
- CS9236: Mengkompilasi memerlukan pengikatan ekspresi lambda setidaknya beberapa kali. Pertimbangkan untuk mendeklarasikan ekspresi lambda dengan jenis parameter eksplisit, atau jika panggilan metode tersebut adalah generik, pertimbangkan untuk menggunakan argumen jenis eksplisit.
Batasan sintaks dalam ekspresi lambda
Beberapa sintaks C# dilarang dalam ekspresi lambda dan metode anonim. Menggunakan konstruksi yang tidak valid dalam ekspresi lambda menyebabkan kesalahan berikut:
-
CS1621: Pernyataan
yieldtidak dapat digunakan di dalam metode anonim atau ekspresi lambda. -
CS1628: Tidak dapat menggunakan
inparameter ,ref, atauoutdi dalam metode anonim, ekspresi lambda, atau ekspresi kueri. - CS1632: Kontrol tidak dapat meninggalkan isi metode anonim atau ekspresi lambda.
-
CS1673: Metode anonim, ekspresi lambda, dan ekspresi kueri di dalam struktur tidak dapat mengakses anggota instans .
this - CS1686: Variabel lokal atau anggotanya tidak dapat mengambil alamat mereka dan digunakan di dalam metode anonim atau ekspresi lambda.
- CS8175: Tidak dapat menggunakan ref local di dalam metode anonim, ekspresi lambda, atau ekspresi kueri.
Semua konstruksi berikut tidak diizinkan dalam ekspresi lambda:
-
yieldpernyataan (yield returnatauyield break) - Memanggil metode yang memiliki
inparameter , ,refatauout -
refvariabel lokal -
break,goto, dancontinuepernyataan akses saat adalah tipe - Metode anonim atau ekspresi lambda di dalam ekspresi lain, seperti konstruktor Atribut.
Anda tidak dapat menggunakan salah satu konstruksi ini dalam ekspresi lambda atau metode anonim. Banyak yang diizinkan dalam fungsi lokal.
Selain itu, jenis handler string terinterpolasi diabaikan saat diterapkan ke parameter lambda. Jika Anda menggunakannya, Anda akan melihat peringatan berikut:
- CS8971: InterpolatedStringHandlerArgument tidak berpengaruh ketika diterapkan ke parameter lambda dan akan diabaikan di situs panggilan.
Ekspresi tertentu menyebabkan pengkompilasi mengeluarkan peringatan informasi berikut:
- CS9236: Mengkompilasi memerlukan melakukan pengikatan ekspresi lambda setidaknya beberapa kali. Pertimbangkan untuk mendeklarasikan ekspresi lambda dengan tipe parameter eksplisit, atau jika metode yang mengandung panggilan bersifat generik, pertimbangkan untuk menggunakan argumen tipe eksplisit.
Kompleksitas ekspresi lambda dan bagaimana mereka memanggil ekspresi lambda lainnya berdampak negatif pada performa kompilator. Alasannya adalah bahwa pengkompilasi harus menyimpulkan jenis parameter dan argumen melalui ekspresi lambda dan jenis potensial membutuhkan waktu.
Parameter dan nilai pengembalian pada ekspresi Lambda
Kesalahan ini menunjukkan masalah dengan deklarasi parameter:
- CS0748: Penggunaan parameter lambda yang tidak konsisten; jenis parameter harus semua eksplisit atau semua implisit.
- CS9098: Parameter lambda yang ditik secara implisit '...' tidak dapat memiliki nilai default.
- CS8030: Fungsi anonim yang dikonversi menjadi delegasi yang mengembalikan void tidak dapat mengembalikan nilai.
- CS8916: Atribut pada ekspresi lambda memerlukan daftar parameter yang dikurung.
- CS8975: Kata kunci kontekstual 'var' tidak dapat digunakan sebagai jenis pengembalian lambda eksplisit.
Parameter ekspresi Lambda harus mengikuti aturan ini:
- Ketika ekspresi lambda memiliki beberapa parameter, semua parameter harus ditik secara eksplisit atau semua parameter harus ditik secara implisit.
- Semua parameter lambda dengan nilai default harus ditik secara eksplisit.
- Jika atribut diterapkan ke parameter apa pun, daftar parameter harus diapit dalam tanda kurung.
Jenis pengembalian ekspresi lambda harus mengikuti aturan ini:
- Ekspresi lambda yang mengembalikan nilai apa pun tidak dapat dikonversi ke delegasi yang mengembalikan
void, sepertiAction. - Jenis pengembalian baik disimpulkan atau dinyatakan secara eksplisit. Jenis pengembalian yang dinyatakan menggunakan kata kunci
vartidak diizinkan.
Jenis delegasi ekspresi Lambda
- CS9099: Peringatan: Nilai parameter default tidak cocok dalam jenis delegasi target.
Ketika Anda mendeklarasikan nilai default atau menambahkan pengubah params dengan parameter ekspresi lambda, jenis delegasi tersebut bukan salah satu dari jenis Func atau Action. Sebaliknya, ini adalah tipe khusus yang menyertakan nilai parameter default atau modifikator params. Kode berikut menghasilkan peringatan karena menetapkan ekspresi lambda yang memiliki parameter default ke Action jenis:
Action<int> a1 = (int i = 2) => { };
Action<string[]> a3 = (params string[] s) => { };
Untuk memperbaiki kesalahan, hapus parameter default atau gunakan variabel yang ditik secara implisit untuk jenis delegasi:
Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };