Kesalahan dan peringatan yang terkait dengan yield return pernyataan dan metode iterator

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 return dan opsional yield break) juga tidak dapat menggunakan return pernyataan untuk mengembalikan urutan.
  • Metode iterator harus mendeklarasikan jenis antarmuka iterator sebagai jenis pengembalian. Jenis IEnumerator<T>
  • Pernyataan yield return harus 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 return dapat berjenis tidak aman, seperti penunjuk.
  • Metode iterator tidak yield return dapat dengan ref. 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 return dapat dari klausul catch atau finally .
  • Anda tidak yield return dapat dari try blok dengan klausul tangkapan.
  • Anda tidak yield return dapat dari blok unsafe . Konteks untuk iterator membuat blok berlapis safe dalam blok penutup unsafe .
  • 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.