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
, atauSystem.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
required
pengubah , ,volatile
ataureadonly
.
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
, atauSystem.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
, aSystem.Index
atauSystem.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-tulisSpan<T>
. Anda dapat menggunakanReadOnlySpan<T>
sebagai gantinya. - Konteks aman array sebaris harus setidaknya seluas konteks
Span<T>
aman atauReadOnlySpan<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.