Bagikan melalui


Mengatasi kesalahan dan peringatan dengan deklarasi array sebaris

Artikel ini membahas kesalahan dan peringatan pengkompilasi berikut:

  • CS9164: Tidak dapat mengonversi ekspresi ke Span<T> karena bukan variabel yang dapat ditetapkan
  • CS9165: Tidak dapat mengonversi ekspresi ke ReadOnlySpan<T> karena mungkin tidak diteruskan atau dikembalikan oleh referensi
  • CS9166: Indeks berada di luar batas array sebaris
  • CS9167: Panjang array sebaris harus lebih besar dari 0.
  • CS9168: Struktur array sebaris tidak boleh memiliki tata letak eksplisit.
  • CS9169: Struktur array sebaris harus mendeklarasikan satu dan hanya satu bidang instans yang tidak boleh menjadi bidang ref.
  • CS9172: Elemen dari jenis array sebaris hanya dapat diakses dengan satu argumen yang secara implisit dapat dikonversi ke int, System.Index, atau System.Range.
  • CS9173: Akses array sebaris mungkin tidak memiliki penentu argumen bernama
  • CS9180: Bidang elemen array sebaris tidak dapat dinyatakan sebagai diperlukan, baca-baca, volatil, atau sebagai buffer ukuran tetap.
  • CS9181: Pengindeks array sebaris tidak akan digunakan untuk ekspresi akses elemen.
  • CS9182: Metode 'Ikhtisar' array sebaris tidak akan digunakan untuk ekspresi akses elemen.
  • CS9183: Operator konversi array sebaris tidak akan digunakan untuk konversi dari ekspresi jenis deklarasikan.
  • CS9184: Fitur bahasa 'Array sebaris' tidak didukung untuk jenis array sebaris dengan bidang elemen yang merupakan bidang ''ref, atau memiliki tipe yang tidak valid sebagai argumen jenis.
  • CS9189: foreach pernyataan pada array sebaris jenis tidak didukung

Deklarasi array sebaris

Anda mendeklarasikan array sebaris sebagai struct jenis dengan satu bidang, dan atribut yang menentukan panjang array. Pengkompilasi menghasilkan kesalahan berikut untuk deklarasi array sebaris yang tidak valid:

  • CS9167: Panjang array sebaris harus lebih besar dari 0.
  • CS9168: Struktur array sebaris tidak boleh memiliki tata letak eksplisit.
  • CS9169: Struktur array sebaris harus mendeklarasikan satu dan hanya satu bidang instans yang tidak boleh menjadi bidang ref.
  • CS9180: Bidang elemen array sebaris tidak dapat dinyatakan sebagai diperlukan, baca-baca, volatil, atau sebagai buffer ukuran tetap.
  • CS9184: Fitur bahasa 'Array sebaris' tidak didukung untuk jenis array sebaris dengan bidang elemen yang merupakan bidang ''ref, atau memiliki tipe yang tidak valid sebagai argumen jenis.

Untuk memperbaiki array ini, pastikan berikut ini benar:

  • Argumen ke bilangan bulat System.Runtime.CompilerServices.InlineArrayAttribute positif.
  • struct Penutup tidak menentukan tata letak eksplisit apa pun.
  • struct Penutup memiliki satu bidang instans, dan bidang instans tersebut bukan bidangref.
  • Bidang instans tunggal bukan buffer ukuran tetap.
  • Bidang instans tunggal tidak menyertakan requiredpengubah , , volatileatau readonly .

Akses elemen

Anda mengakses elemen array sebaris dengan cara yang sama seperti array apa pun. Pengkompilasi memancarkan kesalahan berikut dari akses elemen yang salah:

  • CS9166: Indeks berada di luar batas array sebaris
  • CS9172: Elemen dari jenis array sebaris hanya dapat diakses dengan satu argumen yang secara implisit dapat dikonversi ke int, System.Index, atau System.Range.
  • CS9173: Akses array sebaris mungkin tidak memiliki penentu argumen bernama
  • CS9189: foreach pernyataan pada array sebaris jenis tidak didukung

Selain itu, kompilator mengeluarkan peringatan berikut saat Anda mendeklarasikan pengindeks:

  • CS9181: Pengindeks array sebaris tidak akan digunakan untuk ekspresi akses elemen.

Kode yang dihasilkan untuk buffer sebaris mengakses memori buffer secara langsung, melewati pengindeks yang dideklarasikan. Array sebaris tidak dapat digunakan dengan foreach pernyataan .

Argumen ke pengindeks harus:

  • Salah satu dari ketiga jenis ini: int, a System.Index atau System.Range.
  • Tidak dapat berupa argumen bernama. Pengkompilasi menghasilkan aksesor elemen. Parameter tidak memiliki nama, sehingga Anda tidak dapat menggunakan argumen bernama.
  • Disertakan dalam batas array. Seperti semua array .NET, akses elemen array sebaris diperiksa batasnya. Indeks harus berada dalam batas array sebaris.

Konversi ke Rentang

Anda sering menggunakan System.Span<T> atau System.ReadOnlySpan<T> untuk bekerja dengan array sebaris. Pengkompilasi menghasilkan kesalahan berikut untuk konversi yang tidak valid:

  • CS9164: Tidak dapat mengonversi ekspresi ke Span<T> karena bukan variabel yang dapat ditetapkan
  • CS9165: Tidak dapat mengonversi ekspresi ke ReadOnlySpan<T> karena mungkin tidak diteruskan atau dikembalikan oleh referensi

Pengkompilasi menghasilkan kode yang langsung mengakses memori untuk buffer sebaris. Oleh karena itu, beberapa anggota tidak pernah dipanggil. Pengkompilasi menghasilkan peringatan berikut jika Anda menulis salah satu anggota yang tidak pernah dipanggil:

  • CS9182: Metode 'Ikhtisar' array sebaris tidak akan digunakan untuk ekspresi akses elemen.
  • CS9183: Operator konversi array sebaris tidak akan digunakan untuk konversi dari ekspresi jenis deklarasikan.

Array sebaris dapat dikonversi secara implisit ke Span<T> atau ReadOnlySpan<T> untuk meneruskan array sebaris ke metode. Kompilator memberlakukan pembatasan pada konversi tersebut:

  • Array sebaris harus dapat ditulis untuk mengonversi array sebaris menjadi Span<T>. Jika array baca-saja, Anda tidak dapat mengonversinya menjadi bisa-tulis Span<T>. Anda dapat menggunakan ReadOnlySpan<T> sebagai gantinya.
  • Konteks aman array sebaris harus setidaknya seluas konteks Span<T> aman atau ReadOnlySpan<T> agar konversi berhasil. Anda harus membatasi konteks rentang, atau memperluas cakupan array sebaris.

Selain itu, pengkompilasi tidak pernah menghasilkan panggilan ke Slice metode dalam buffer sebaris. Operator konversi untuk mengonversi buffer sebaris menjadi Span atau ReadOnlySpan tidak dipanggil. Pengkompilasi menghasilkan kode untuk membuat System.Span<T> atau System.ReadOnlySpan<T> langsung dari buffer memori.