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.
Kesalahan dan peringatan yang terkait dengan
Ada banyak kesalahan yang terkait dengan yield return pernyataan dan metode iterator:
- CS1622: Tidak dapat mengembalikan nilai dari iterator. Gunakan pernyataan pengembalian hasil untuk mengembalikan nilai, atau menghasilkan pemutusan untuk mengakhiri perulangan.
- CS1624: Isi 'aksesor' tidak dapat menjadi blok iterator karena 'jenis' bukan jenis antarmuka iterator
- CS1625: Tidak dapat menghasilkan dalam isi klausul akhirnya
- CS1626: Tidak dapat menghasilkan nilai dalam isi blok percobaan dengan klausa tangkapan
- CS1627: Ekspresi diharapkan setelah hasil kembali
- CS1629: Kode tidak aman mungkin tidak muncul di iterator
- CS1631: Tidak dapat menghasilkan nilai dalam isi klausa tangkapan
- CS1637: Iterator tidak dapat memiliki parameter atau jenis hasil yang tidak aman
- CS4013: Instans jenis tidak dapat digunakan di dalam fungsi berlapis, ekspresi kueri, blok iterator, atau metode asinkron
- CS8154: Isi tidak dapat menjadi blok iterator karena dikembalikan berdasarkan referensi
- CS8176: Iterator tidak dapat memiliki lokal dengan referensi
- CS9238: Tidak dapat menggunakan 'hasil hasil' dalam blok 'tidak aman'
-
CS9239: Operator
&tidak dapat digunakan pada parameter atau variabel lokal dalam metode iterator.
Struktur metode iterator
Metode iterator harus sesuai dengan beberapa aturan di C#. Kompilator mengeluarkan kesalahan berikut saat metode iterator Anda melanggar satu atau beberapa aturan tersebut:
- CS1622: Tidak dapat mengembalikan nilai dari iterator. Gunakan pernyataan pengembalian hasil untuk mengembalikan nilai, atau menghasilkan pemutusan untuk mengakhiri perulangan.
- CS1624: Isi 'aksesor' tidak dapat menjadi blok iterator karena 'jenis' bukan jenis antarmuka iterator
- CS1627: Ekspresi diharapkan setelah hasil kembali
- CS1637: Iterator tidak dapat memiliki parameter atau jenis hasil yang tidak aman
- CS8154: Isi tidak dapat menjadi blok iterator karena dikembalikan berdasarkan referensi
Metode iterator Anda harus mengikuti aturan berikut:
- Metode iterator (menggunakan
yield returndan opsionalyield break) juga tidak dapat menggunakanreturnpernyataan untuk mengembalikan urutan. - Metode iterator harus mendeklarasikan jenis antarmuka iterator sebagai jenis pengembalian. Jenis IEnumerator<T>
- Pernyataan
yield returnharus menyertakan ekspresi untuk dikembalikan sebagai bagian dari urutan.yield return;tidak valid. - Metode iterator tidak dapat menggunakan jenis yang tidak aman sebagai parameter, seperti penunjuk.
- Metode iterator tidak
yield returndapat berjenis tidak aman, seperti penunjuk. - Metode iterator tidak
yield returndapat denganref. Anda harus mengembalikan berdasarkan nilai.
Pembatasan metode iterator
Isi metode iterator harus sesuai dengan pembatasan pada yield return pernyataan dan konteksnya. Kompilator mengeluarkan kesalahan berikut saat iterator Anda melanggar salah satu batasan ini:
- CS1625: Tidak dapat menghasilkan dalam isi klausul akhirnya
- CS1626: Tidak dapat menghasilkan nilai dalam isi blok percobaan dengan klausa tangkapan
- CS1631: Tidak dapat menghasilkan nilai dalam isi klausa tangkapan
- CS1629: Kode tidak aman mungkin tidak muncul di iterator
- CS9238: Tidak dapat menggunakan 'hasil hasil' dalam blok 'tidak aman'
-
CS9239: Operator
&tidak dapat digunakan pada parameter atau variabel lokal dalam metode iterator.
Kesalahan ini menunjukkan bahwa kode Anda melanggar aturan keamanan karena iterator mengembalikan elemen dan melanjutkan untuk menghasilkan elemen berikutnya:
- Anda tidak
yield returndapat dari klausulcatchataufinally. - Anda tidak
yield returndapat daritryblok dengan klausul tangkapan. - Anda tidak
yield returndapat dari blokunsafe. Konteks untuk iterator membuat blok berlapissafedalam blok penutupunsafe. - Anda tidak dapat menggunakan
&operator untuk mengambil alamat variabel dalam metode iterator.
Sebelum C# 13, iterator tidak dapat berisi unsafe kode (CS1629). Dimulai dengan C# 13, pembatasan ini dilonggarkan. Semua yield return pernyataan harus dalam konteks yang aman, tetapi metode iterator dapat berisi unsafe kode.
keamanan ref dalam metode iterator
Metode iterator memiliki pembatasan keamanan ref khusus. Aturan ini dilonggarkan di C# 13:
- CS4013: Instans jenis tidak dapat digunakan di dalam fungsi berlapis, ekspresi kueri, blok iterator, atau metode asinkron
- CS8176: Iterator tidak dapat memiliki lokal dengan referensi
Sebelum C# 13, iterator tidak dapat mendeklarasikan ref variabel lokal. Mereka tidak dapat mendeklarasikan variabel jenis ref struct apa pun.
Dimulai dengan C# 13, ref struct jenis dapat digunakan dalam metode iterator, jika tidak diakses di seluruh yield return pernyataan. Dimulai dengan C# 13, metode iterator dapat mendeklarasikan ref variabel lokal.