Bagikan melalui


Kesalahan dan peringatan saat menggunakan ekspresi lambda dan fungsi anonim

Beberapa kesalahan berkaitan dengan mendeklarasikan dan menggunakan ekspresi lambda dan metode anonim:

  • CS0407: 'method' memiliki jenis pengembalian yang salah.
  • CS0428: Tidak dapat mengonversi kelompok metode 'Identifier' ke jenis non-delegasi 'type'. Apakah Anda berniat untuk memanggil metode?
  • CS0748: Penggunaan parameter lambda yang tidak konsisten; jenis parameter harus semua eksplisit atau semua implisit.
  • CS0815: Tidak dapat menetapkan 'ekspresi' ke variabel yang ditik implisit.
  • CS0828: Tidak dapat menetapkan 'ekspresi' ke properti tipe anonim.
  • CS0837: Operand pertama operator 'is' atau 'as' mungkin bukan ekspresi lambda, metode anonim, atau grup metode.
  • CS1065: Nilai default tidak valid dalam konteks ini.
  • CS1621: Pernyataan hasil tidak dapat digunakan di dalam metode anonim atau ekspresi lambda.
  • CS1628: Tidak dapat menggunakan inref atau out parameter di dalam metode anonim, ekspresi lambda, atau ekspresi kueri.
  • CS1632: Kontrol tidak dapat meninggalkan isi metode anonim atau ekspresi lambda.
  • CS1643: Tidak semua jalur kode mengembalikan nilai dalam metode anonim jenis 'type'.
  • CS1660: Tidak dapat mengonversi ekspresi lambda ke tipe 'type' karena bukan tipe delegat.
  • CS1661: Tidak dapat mengonversi blok metode anonimus menjadi tipe 'type' karena jenis parameternya tidak cocok dengan jenis parameter delegat.
  • CS1662: Tidak dapat mengonversi blok metode anonim ke jenis delegasi yang dimaksudkan karena beberapa jenis pengembalian di blok tidak secara implisit dapat dikonversi ke jenis pengembalian delegasi.
  • CS1673: Metode anonim, ekspresi lambda, dan ekspresi kueri di dalam struktur tidak dapat mengakses anggota instans 'ini'.
  • CS1676: Parameter 'number' harus dideklarasikan dengan kata kunci 'kata kunci'.
  • CS1677: Parameter 'number' tidak boleh dideklarasikan dengan kata kunci 'kata kunci'.
  • CS1678: Parameter 'number' dinyatakan sebagai jenis 'type1' tetapi harus 'type2'.
  • CS1686: Variabel lokal atau anggotanya tidak dapat mengambil alamat mereka dan digunakan di dalam metode anonim atau ekspresi lambda.
  • CS1688: Tidak dapat mengonversi blok metode anonim tanpa daftar parameter ke tipe delegate 'delegat' karena memiliki satu atau beberapa parameter out.
  • CS1706: Ekspresi tidak boleh berisi metode anonim atau ekspresi lambda.
  • CS1731: Tidak dapat mengonversi ekspresi untuk mendelegasikan karena beberapa jenis pengembalian di blok tidak secara implisit dapat dikonversi ke jenis pengembalian delegasi.
  • CS1732: Parameter yang diharapkan.
  • CS1764: Tidak dapat menggunakan lokal tetap di dalam metode anonim, ekspresi lambda, atau ekspresi kueri.
  • 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.
  • CS8820: Fungsi anonim statis tidak dapat berisi referensi ke 'variabel'.
  • CS8821: Fungsi anonim statis tidak dapat berisi referensi ke 'ini' atau 'dasar'.
  • CS8916: Atribut pada ekspresi lambda memerlukan daftar parameter yang dikurung.
  • CS8917: Jenis delegasi tidak dapat disimpulkan.
  • CS8934: Tidak dapat mengonversi metode anonim ke tipe 'type' karena tipe pengembalian tidak sesuai dengan tipe pengembalian delegasi.
  • CS8975: Kata kunci var kontekstual tidak dapat digunakan sebagai jenis pengembalian lambda eksplisit.
  • CS9098: Parameter lambda yang ditik secara implisit '...' tidak dapat memiliki nilai default.

Selain itu, beberapa peringatan berkaitan dengan mendeklarasikan dan menggunakan ekspresi lambda:

  • CS0467: Kekaburan antara fungsi 'method' dan bukan fungsi 'non-method'. Menggunakan kelompok fungsi.
  • CS1911: Akses ke anggota melalui kata kunci 'dasar' dari metode anonim, ekspresi lambda, ekspresi kueri, atau iterator menghasilkan kode yang tidak dapat diverifikasi.
  • CS8971: InterpolatedStringHandlerArgument tidak berpengaruh ketika diterapkan ke parameter lambda dan akan diabaikan di situs panggilan.
  • CS8974: Mengonversi grup metode 'method' ke tipe 'type' non-delegasi. Apakah Anda berniat untuk memanggil metode?
  • 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

  • CS0837: Operan pertama operator is atau as mungkin bukan ekspresi lambda, metode anonim, atau grup metode.
  • CS1621: Pernyataan yield tidak dapat digunakan di dalam metode anonim atau ekspresi lambda.
  • CS1628: Tidak dapat menggunakan inparameter , ref, atau out 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 .this
  • 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.
  • CS1764: Tidak dapat menggunakan lokal tetap di dalam metode anonim, ekspresi lambda, atau ekspresi kueri.
  • CS1911: Peringatan: Akses ke anggota melalui kata kunci 'dasar' dari metode anonim, ekspresi lambda, ekspresi kueri, atau iterator menghasilkan kode yang tidak dapat diverifikasi.
  • CS8175: Tidak dapat menggunakan ref local di dalam metode anonim, ekspresi lambda, atau ekspresi kueri.
  • CS8820: Fungsi anonim statis tidak dapat berisi referensi ke 'variabel'.
  • CS8821: Fungsi anonim statis tidak dapat berisi referensi ke 'ini' atau 'dasar'.
  • CS8971: Peringatan: InterpolatedStringHandlerArgument tidak berpengaruh ketika diterapkan ke parameter lambda dan akan diabaikan di situs panggilan.
  • CS9236: Informasi: Proses kompilasi memerlukan pengikatan ekspresi lambda setidaknya sejumlah kali. Pertimbangkan mendeklarasikan ekspresi lambda dengan jenis parameter yang eksplisit, atau jika panggilan metode yang bersifat generik, pertimbangkan untuk menggunakan argumen jenis eksplisit.

Kompilator melarang konstruksi C# tertentu di dalam ekspresi lambda dan metode anonim. Pembatasan ini ada karena pengompilasi mengubah lambda dan metode anonim menjadi mendelegasikan pemanggilan atau pohon ekspresi, dan beberapa konstruksi tidak dapat diwakili dalam bentuk tersebut. Untuk informasi selengkapnya, lihat bagian ekspresi fungsi anonim dari spesifikasi C#.

Anda dapat memperbaiki kesalahan ini dengan menggunakan panduan berikut:

  • Pindahkan pernyataan yield return atau yield break dari dalam tubuh lambda ke dalam metode iterator yang melingkupinya, atau konversikan lambda menjadi fungsi lokal yang mendukung pernyataan yield (CS1621).
  • Hindari mereferensikan parameter in, ref, atau out dari metode yang melingkupi di dalam tubuh lambda. Ketika lambda menangkap parameter ini sebagai bagian dari closure, semantik parameter seperti ref tidak dapat dijaga. Salin nilai ke variabel lokal dan gunakan lokal tersebut sebagai gantinya, atau konversikan lambda ke fungsi lokal (CS1628).
  • Hapus pernyataan break, goto, atau continue apa pun yang mentransfer kontrol keluar dari badan lambda. Pernyataan alur kontrol harus menargetkan label atau perulangan di dalam tubuh lambda yang sama (CS1632).
  • Dalam jenis struct , hindari mereferensikan anggota instans melalui this di dalam ekspresi lambda, metode anonim, atau ekspresi kueri. Karena kompilator menangkap this berdasarkan nilai dalam struct, mutasi di dalam lambda tidak memengaruhi instans asli. Ekstrak nilai anggota yang diperlukan ke variabel lokal sebelum lambda, atau konversi ke fungsi lokal, yang dapat mengakses this secara langsung (CS1673).
  • Jangan mengambil alamat variabel lokal yang juga ditangkap oleh lambda. Pengkompilasi memindahkan variabel yang ditangkap ke objek penutupan yang dialokasikan di tumpukan, membuat alamatnya tidak stabil. Pisahkan logika pengambilan alamat dari lambda, atau gunakan fungsi lokal sebagai gantinya (CS1686).
  • Pindahkan ekspresi lambda atau metode anonim dari ekspresi yang berisi yang melarangnya. Beberapa ekspresi, seperti konstruktor atribut, tidak mendukung ekspresi lambda atau metode anonim sebagai argumen (CS1706).
  • Jangan gunakan fixed variabel lokal di dalam bodi lambda. Jaminan penyematan fixed pernyataan hanya berlaku untuk cakupan penutup, bukan untuk penutup yang dihasilkan kompilator (CS1764).
  • Jangan gunakan ref lokal di dalam badan lambda. Seperti ref parameter, ref lokal tidak dapat ditangkap dalam penutupan yang dihasilkan kompilator untuk lambda. Tetapkan nilai ke variabel non-lokalref , atau konversikan lambda ke fungsi lokal (CS8175).
  • Jangan gunakan ekspresi lambda, metode anonim, atau grup metode sebagai operand pertama operator is atau as . Konstruksi ini tidak memiliki tipe yang dapat diuji pada waktu proses. Tetapkan ekspresi ke variabel terlebih dahulu, lalu uji variabel (CS0837).
  • Hapus pengubah static dari lambda, atau hapus referensi ke variabel yang diambil. static Lambda secara eksplisit melarang menangkap variabel lokal, parameter, atau this untuk menghindari alokasi penutupan yang tidak diinginkan. Jika Anda perlu mereferensikan variabel luar, hapus pengubah static . Jika Anda ingin menjaga alokasi timbunan tetap minimal, teruskan nilai sebagai parameter ke lambda (CS8820, CS8821).
  • Hapus InterpolatedStringHandlerArgumentAttribute dari parameter lambda, atau pindahkan logika ke metode di mana atribut tersebut dihormati. Kompilator mengabaikan atribut ini terhadap parameter lambda karena pemanggilan lambda tidak menggunakan proses penurunan handler string terinterpolasi yang sama seperti panggilan metode reguler (CS8971).
  • Hindari memanggil anggota virtual melalui base kata kunci di dalam fungsi lambda atau fungsi anonim. Pengkompilasi menghasilkan panggilan non-virtual melalui metode pembantu, yang menghasilkan kode yang tidak dapat diverifikasi. Pertimbangkan untuk mengekstrak fungsi panggilan tersebut ke dalam metode terpisah dan menggunakan metode tersebut dari lambda sebagai gantinya (CS1911).
  • Kurangi kompleksitas panggilan metode yang kelebihan beban yang menerima ekspresi lambda, atau tambahkan informasi jenis eksplisit. Ketika pengkompilasi harus mengikat ekspresi lambda beberapa kali untuk menyelesaikan kelebihan beban, ia memancarkan diagnostik informasi ini. Mendeklarasikan lambda dengan jenis parameter eksplisit, atau menyediakan argumen jenis eksplisit pada panggilan metode generik, mengurangi jumlah pengikatan yang harus dilakukan pengkompilasi (CS9236).

Parameter dan nilai pengembalian pada ekspresi Lambda

  • CS0748: Penggunaan parameter lambda yang tidak konsisten; jenis parameter harus semua eksplisit atau semua implisit.
  • CS1065: Nilai default tidak valid dalam konteks ini.
  • CS1643: Tidak semua jalur kode mengembalikan nilai dalam metode anonim jenis 'type'.
  • CS1661: Tidak dapat mengonversi blok metode anonim ke tipe 'jenis' karena tipe parameter tidak cocok dengan tipe parameter delegasi.
  • CS1662: Tidak dapat mengonversi blok metode anonim ke jenis delegasi yang dimaksudkan karena beberapa jenis pengembalian di blok tidak secara implisit dapat dikonversi ke jenis pengembalian delegasi.
  • CS1676: Parameter 'number' harus dideklarasikan dengan kata kunci 'keyword'.
  • CS1677: Parameter 'number' tidak boleh dideklarasikan dengan kata kunci 'keyword'.
  • CS1678: Parameter 'number' dinyatakan sebagai jenis 'type1' tetapi harus 'type2'.
  • CS1688: Tidak dapat mengonversi blok metode anonim tanpa daftar parameter untuk mendelegasikan jenis 'delegasi' karena memiliki satu atau beberapa parameter keluar.
  • CS1731: Tidak dapat mengonversi ekspresi untuk mendelegasikan karena beberapa jenis pengembalian di blok tidak secara implisit dapat dikonversi ke jenis pengembalian delegasi.
  • CS1732: Parameter yang diharapkan.
  • CS8030: Fungsi anonim yang dikonversi menjadi delegasi yang mengembalikan void tidak dapat mengembalikan nilai.
  • CS8916: Atribut pada ekspresi lambda memerlukan daftar parameter yang dikurung.
  • CS8934: Tidak dapat mengonversi metode anonim ke tipe 'type' karena tipe pengembalian tidak cocok dengan tipe pengembalian delegate.
  • CS8975: Kata kunci kontekstual 'var' tidak dapat digunakan sebagai jenis pengembalian lambda eksplisit.
  • CS9098: Parameter lambda yang ditik secara implisit '...' tidak dapat memiliki nilai default.

Kesalahan ini menunjukkan masalah dengan parameter ekspresi lambda atau deklarasi jenis pengembalian. Untuk aturan lengkap tentang parameter lambda dan jenis pengembalian, lihat ekspresi lambda, metode anonim, dan bagian ekspresi fungsi anonim dari spesifikasi C#.

Nota

CS1731 dan CS1732 tidak lagi diproduksi oleh versi kompilator C# saat ini (Roslyn). Mereka mungkin muncul jika Anda menggunakan versi kompilator yang lebih lama.

Anda dapat memperbaiki kesalahan ini dengan menggunakan panduan berikut:

  • Pastikan bahwa semua parameter dalam ekspresi lambda menggunakan gaya pengetikan yang sama. Ketika lambda memiliki beberapa parameter, setiap parameter harus ditik secara eksplisit atau ditik secara implisit—Anda tidak dapat mencampur dua gaya dalam daftar parameter yang sama (CS0748).
  • Tambahkan jenis eksplisit ke parameter lambda apa pun yang memiliki nilai default. Pengkompilasi memerlukan jenis eksplisit pada parameter dengan default karena harus menghasilkan jenis delegasi kustom yang mengodekan nilai default. Parameter yang di ketik secara implisit tidak memberikan informasi yang cukup bagi kompilator untuk membuat jenis delegasi tersebut (CS1065, CS9098).
  • Hapus nilai parameter default dari metode anonim yang dideklarasikan dengan menggunakan delegate operator. Nilai parameter default hanya didukung dalam ekspresi lambda, bukan dalam metode anonim. Konversikan metode anonim ke ekspresi lambda jika Anda memerlukan nilai default (CS1065).
  • Cocokkan jenis parameter, ref/out/inpengubah, dan jumlah parameter metode lambda atau anonim dengan jenis delegasi target. Pengompilasi melakukan kecocokan yang tepat dari tanda tangan parameter saat mengonversi fungsi anonim ke delegasi: setiap parameter harus memiliki jenis yang benar, dan pengubah , , refatau out apa pun inharus ada tepat ketika delegasi mengharapkannya (CS1661, CS1676, CS1677, CS1678).
  • Tambahkan daftar parameter ke metode anonim saat jenis delegasi target memiliki out parameter. Metode anonim yang dideklarasikan tanpa daftar parameter (dengan menggunakan delegate { } sintaks) dapat mencocokkan sebagian besar jenis delegasi, tetapi pengompilasi tidak dapat mensintesis parameter yang diperlukan out secara implisit. Nyatakan parameter secara eksplisit agar sesuai dengan tanda tangan delegasi (CS1688).
  • Pastikan bahwa semua jalur kode dalam lambda atau metode anonim menghasilkan nilai ketika tipe delegasi target memiliki tipe pengembalian bukan void. Setiap cabang melalui isi harus menghasilkan nilai pengembalian yang secara implisit dapat dikonversi ke jenis pengembalian delegasi (CS1643, CS1662, CS1731, CS8934).
  • Hapus pernyataan return apapun yang memiliki nilai dari lambda atau metode anonim yang ditetapkan ke tipe delegasi yang mengembalikan void seperti Action. Karena jenis pengembalian delegasi adalah void, isi tidak dapat mengembalikan nilai (CS8030).
  • Sertakan daftar parameter dalam tanda kurung saat atribut diterapkan ke parameter lambda apa pun. Pengkompilasi memerlukan formulir yang dikurung untuk membedakan sintaks atribut dari ekspresi lain. Misalnya, tulis ([MyAttribute] int x) => x alih-alih [MyAttribute] x => x (CS8916).
  • Gunakan nama jenis tertentu alih-alih var sebagai jenis pengembalian eksplisit ekspresi lambda. Kata kunci var dicadangkan untuk variabel lokal yang didefinisikan secara implisit dan tidak dapat digunakan sebagai anotasi tipe pengembalian lambda. Tentukan jenis pengembalian aktual, atau hilangkan jenis pengembalian dan biarkan pengkompilasi menyimpulkannya (CS8975).
  • Perbaiki daftar parameter sehingga pengkompilasi dapat mengenalinya sebagai deklarasi parameter yang valid. Kesalahan ini menunjukkan daftar parameter yang salah bentuk di mana pengkompilasi mengharapkan pengidentifikasi parameter tetapi menemukan sesuatu yang lain (CS1732).

Jenis delegasi ekspresi Lambda

  • CS0407: 'method' memiliki jenis pengembalian yang salah.
  • CS0428: Tidak dapat mengonversi kelompok metode 'Pengidentifikasi' ke tipe bukan delegat 'type'. Apakah Anda bermaksud untuk memanggil metode tersebut?
  • CS0467: Peringatan: Ambiguitas antara 'method' sebagai metode dan 'non-method' sebagai non-metode. Menggunakan kelompok metode.
  • CS0815: Tidak dapat menetapkan 'ekspresi' ke variabel yang ditik implisit.
  • CS0828: Tidak dapat menetapkan 'ekspresi' ke properti tipe anonim.
  • CS1660: Tidak dapat mengonversi ekspresi lambda menjadi tipe 'type' karena bukan merupakan tipe delegasi.
  • CS8917: Jenis delegasi tidak dapat disimpulkan.
  • CS8974: Peringatan: Mengonversi kelompok metode 'method' ke tipe 'type' non-delegasi. Apakah Anda berniat untuk memanggil metode?
  • CS9099: Peringatan: Nilai parameter default tidak cocok dalam jenis delegasi target.
  • CS9100: Peringatan: Parameter memiliki pengubah params dalam lambda tetapi tidak dalam tipe delegasi target.

Kesalahan ini menunjukkan masalah dengan jenis delegasi yang disimpulkan atau diharapkan kompilator untuk ekspresi lambda, metode anonim, atau grup metode. Untuk aturan lengkap tentang konversi delegasi, lihat ekspresi lambda, metode anonim, dan bagian ekspresi fungsi anonim dari spesifikasi C#.

Nota

Versi pengkompilasi C# saat ini (Roslyn) tidak menghasilkan CS0467. Anda mungkin melihat kesalahan ini jika Anda menggunakan versi kompilator yang lebih lama.

Anda dapat memperbaiki kesalahan ini dengan menggunakan panduan berikut:

  • Pastikan bahwa jenis target penugasan atau konversi adalah jenis delegasi atau System.Linq.Expressions.Expression. Ekspresi lambda atau metode anonim tidak dapat ditetapkan ke tipe non-delegasi seperti object atau antarmuka. Ubah jenis variabel menjadi jenis delegasi yang kompatibel seperti Func<> atau Action<>, atau gunakan var untuk membiarkan pengkompilasi menyimpulkan jenis delegasi (CS1660).
  • Berikan konteks yang cukup bagi pengkompilasi untuk menentukan jenis delegasi tunggal untuk ekspresi lambda. Ketika ditetapkan ke var, pengompilasi memerlukan jenis pengembalian dan daftar parameter yang tidak ambigu. Saat ditetapkan ke properti jenis anonim, pengompilasi tidak dapat menyimpulkan jenis delegasi sama sekali. Tetapkan lambda ke variabel dengan jenis delegasi eksplisit, lalu gunakan variabel tersebut dalam penginisialisasi jenis anonim (CS0815, CS0828, CS8917).
  • Cocokkan jenis pengembalian grup metode dengan jenis pengembalian delegat yang telah dideklarasikan. Konversi grup metode mengharuskan jenis pengembalian metode menjadi dapat dikonversi identitas atau secara implisit dapat dikonversi ke jenis pengembalian delegasi. Ubah jenis pengembalian metode, atau ubah jenis delegasi agar cocok (CS0407).
  • Panggil metode alih-alih menetapkan grup metode saat tipe target bukan delegasi. Jika jenis target adalah string, int, atau jenis non-delegasi lainnya, Anda mungkin ingin memanggil metode dan menetapkan hasilnya. Tambahkan tanda kurung dan argumen untuk memanggil metode (CS0428, CS8974).
  • Atasi ambiguitas antara metode dan anggota non-metode yang memiliki nama yang sama. Ganti nama salah satu anggota yang bertentangan, atau gunakan referensi yang sepenuhnya memenuhi syarat untuk menghapus ambiguitas (CS0467).
  • Hapus nilai parameter default dari lambda atau params pengubah ketika tipe delegasi target adalah tipe standar Func<> atau Action<>. Nilai default dan pengubah params menyebabkan pengkompilasi menghasilkan jenis delegasi kustom yang tidak cocok dengan Func<> atau Action<>. var Gunakan untuk membiarkan kompilator mensintesis jenis delegasi yang benar, atau menghapus nilai default atau params pengubah sehingga lambda cocok dengan jenis delegasi yang dideklarasikan (CS9099, CS9100).