Mengatasi kesalahan dan peringatan dalam konstruksi kode yang tidak aman

Artikel ini membahas diagnostik pengkompilasi berikut:

  • CS0193: Operator * atau -> harus diterapkan ke penunjuk
  • CS0196: Penunjuk hanya harus diindeks oleh satu nilai
  • CS0208: Tidak dapat mengambil alamat dari, mendapatkan ukuran dari, atau mendeklarasikan pointer ke tipe terkelola ('type')
  • CS0209: Jenis lokal yang dideklarasikan dalam fixed pernyataan harus merupakan jenis penunjuk
  • CS0210: Anda harus memberikan penginisialisasi dalam deklarasi pernyataan fixed atau using
  • CS0211: Tidak dapat mengambil alamat ekspresi yang diberikan
  • CS0212: Anda hanya dapat mengambil alamat ekspresi yang tidak difiks di dalam fixed penginisialisasi pernyataan
  • CS0213: Anda tidak dapat menggunakan fixed pernyataan untuk mengambil alamat ekspresi yang sudah tetap
  • CS0214: Penunjuk dan buffer ukuran tetap hanya dapat digunakan dalam konteks yang tidak aman
  • CS0227: Kode tidak aman hanya dapat muncul jika dikompilasi dengan /unsafe
  • CS0233: 'pengidentifikasi' tidak memiliki ukuran yang telah ditentukan sebelumnya, oleh karena itu sizeof hanya dapat digunakan dalam konteks yang tidak aman
  • CS0242: Operasi yang bersangkutan tidak terdefinisi pada pointer void
  • CS0244: Baik 'is' maupun 'as' tidak valid pada jenis penunjuk
  • CS0254: Sisi kanan penetapan pernyataan tetap mungkin bukan ekspresi cast
  • CS0459: Tidak dapat mengambil alamat variabel lokal hanya baca
  • CS0821: Variabel lokal yang ditik implisit tidak dapat diperbaiki
  • CS1641: Field buffer dengan ukuran tetap harus memiliki spesifikator ukuran array setelah nama field
  • CS1642: Field buffer berukuran tetap hanya boleh menjadi anggota struct
  • CS1656: Tidak dapat menetapkan ke 'variabel' karena merupakan 'jenis variabel baca-saja'
  • CS1663: Jenis buffer ukuran tetap harus salah satu dari yang berikut ini: bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, atau float, double
  • CS1664: Buffer berukuran tetap dengan panjang 'length' dan tipe 'type' terlalu besar
  • CS1665: Buffer ukuran tetap harus memiliki panjang yang lebih besar dari nol
  • CS1666: Anda tidak dapat menggunakan buffer ukuran tetap yang terkandung dalam ekspresi yang tidak difiks. Coba gunakan pernyataan tetap.
  • CS1708: Buffer ukuran tetap hanya dapat diakses melalui lokal atau bidang
  • CS1716: Jangan gunakan atribut ''System.Runtime.CompilerServices.FixedBuffer. Gunakan pengubah bidang 'tetap' sebagai gantinya.
  • CS1919: Tipe 'nama tipe' tidak aman tidak dapat digunakan dalam pembuatan objek
  • CS4004: Tidak dapat await dalam konteks yang tidak aman
  • CS7092: Buffer tetap mungkin hanya memiliki satu dimensi.
  • CS8372: Jangan gunakan atribut 'System.Runtime.CompilerServices.FixedBuffer' pada properti
  • CS8385: Ekspresi yang diberikan tidak dapat digunakan dalam pernyataan tetap
  • CS8500: Ini mengambil alamat, mengambil ukuran, atau mendeklarasikan pointer ke tipe terkelola ('type')
  • CS8812: Tidak dapat mengonversi kelompok metode 'metode' ke tipe penunjuk non-fungsi 'type'.
  • CS9049: Bidang tetap tidak boleh menjadi bidang ref.
  • CS9123: Operator '&' tidak boleh digunakan pada parameter atau variabel lokal dalam metode asinkron.
  • CS9360: Operasi ini hanya dapat digunakan dalam konteks yang tidak aman
  • CS9361: stackalloc ekspresi tanpa penginisialisasi di dalam SkipLocalsInit hanya dapat digunakan dalam konteks yang tidak aman
  • CS9362: 'anggota' harus digunakan dalam konteks yang tidak aman karena ditandai sebagai 'unsafe'
  • CS9363: 'anggota' harus digunakan dalam konteks yang tidak aman karena memiliki penunjuk dalam tanda tangannya
  • CS9364: Anggota 'anggota' yang tidak aman tidak dapat mengambil alih anggota 'anggota' yang aman
  • CS9365: Anggota 'anggota' tidak aman tidak dapat menerapkan anggota 'anggota' yang aman secara implisit
  • CS9366: Anggota 'anggota' yang tidak aman tidak dapat mengimplementasikan anggota 'anggota' yang aman
  • CS9367: RequiresUnsafeAttribute tidak dapat diterapkan ke simbol ini.
  • CS9368: RequiresUnsafeAttribute hanya berlaku di bawah aturan keamanan memori yang diperbarui.
  • CS9376: Konteks yang tidak aman diperlukan untuk konstruktor 'konstruktor' yang ditandai sebagai 'unsafe' untuk memenuhi batasan 'new()' parameter jenis 'parameter jenis' dalam 'jenis atau metode generik'
  • CS9377: Pengubah 'unsafe' tidak memiliki efek apa pun di sini di bawah aturan keamanan memori saat ini.
  • CS9379: Jangan gunakan 'RequiresUnsafeAttribute' di sumber; gunakan pengubah 'unsafe' sebagai gantinya.
  • CS9388: Pengubah 'safe' hanya dapat digunakan pada anggota 'extern' yang tidak ditandai 'unsafe'.
  • CS9389: anggota 'extern' harus ditandai dengan 'unsafe' atau 'safe'.
  • CS9390: Kedua deklarasi anggota parsial harus ditandai 'safe' atau tidak boleh ditandai 'safe'
  • CS9392: Bidang dalam jenis tata letak eksplisit atau diperluas harus ditandai 'unsafe' atau 'safe'.
  • CS9396: Tidak dapat menentukan pengubah 'unsafe' atau 'safe' pada keduanya, yaitu properti atau pengindeks 'property' maupun aksesornya. Hapus salah satunya.
  • CS9397: Tidak dapat menentukan pengubah 'unsafe' atau 'safe' yang sama pada semua aksesor properti atau pengindeks 'properti'. Sebagai gantinya, letakkan pengubah itu pada properti itu sendiri.
  • CS9398: Tidak dapat menunggu dalam konteks pernyataan 'fixed'

Operasi Pointer dan Dereferensi

  • CS0193: Operator * atau -> harus diterapkan ke penunjuk
  • CS0196: Penunjuk hanya harus diindeks oleh satu nilai
  • CS0242: Operasi tersebut tidak terdefinisi pada penunjuk void

Untuk menggunakan operasi penunjuk dengan benar, ikuti aturan untuk dereferensi, pengindeksan, dan operasi aritmatika. Untuk informasi selengkapnya, lihat Jenis penunjuk dan Penunjuk Fungsi.

  • Terapkan * operator atau -> hanya ke penunjuk data (CS0193). Jangan gunakan operator ini dengan tipe-tipe nonpointer atau pointer fungsi. Tidak seperti di C/C++, Anda tidak dapat mendereferensikan penunjuk fungsi di C#.
  • Penunjuk indeks hanya dengan satu nilai (CS0196). Penunjuk tidak mendukung pengindeksan multidmensional.
  • Hindari operasi yang tidak terdefinisi pada void pointer (CS0242). Misalnya, jangan menaikkan penunjuk kekosongan karena pengkompilasi tidak tahu ukuran data yang ditunjukkan.

Jenis penunjuk dan jenis terkelola

  • CS0208: Tidak dapat mengambil alamat dari, mendapatkan ukuran dari, atau mendeklarasikan pointer untuk tipe terkelola ('type')
  • CS0233: 'pengidentifikasi' tidak memiliki ukuran yang telah ditentukan sebelumnya, oleh karena itu sizeof hanya dapat digunakan dalam konteks yang tidak aman
  • CS8500: Mengambil alamat dari, memperoleh ukuran, atau mendeklarasikan pointer ke tipe terkelola ('type')

Untuk bekerja dengan pointer dan sizeof operator dengan benar, gunakan jenis yang tidak dikelola dan konteks yang tepat. Untuk informasi selengkapnya, lihat Jenis yang tidak dikelola dan sizeof operator.

  • Gunakan pointer hanya dengan jenis yang tidak dikelola (CS0208). Jangan mengambil alamat dari, mengambil ukuran, atau mendeklarasikan pointer ke jenis terkelola. Jenis terkelola mencakup jenis referensi dan struktur yang berisi bidang atau properti jenis referensi.
  • sizeof Gunakan operator dalam unsafe konteks saat bekerja dengan jenis yang ukurannya bukan konstanta waktu kompilasi (CS0233).
  • Hindari mengambil alamat dari, menentukan ukuran, atau mendeklarasikan pointer ke tipe terkelola (CS8500). Peringatan ini (tingkat 4) diaktifkan ketika pengkompilasi mendeteksi operasi penunjuk pada jenis terkelola. Tipe terkelola adalah tipe referensi apa pun, atau struct apa pun yang berisi tipe referensi sebagai field atau properti. Untuk informasi selengkapnya, lihat Jenis yang tidak dikelola.

Penggunaan pernyataan tetap

  • CS0209: Jenis lokal yang dideklarasikan dalam pernyataan tetap harus merupakan jenis penunjuk
  • CS0210: Anda harus memberikan penginisialisasi dalam deklarasi tetap atau using pernyataan
  • CS0211: Tidak dapat mengambil alamat ekspresi yang diberikan
  • CS0212: Anda hanya dapat mengambil alamat ekspresi yang tidak difiks di dalam penginisialisasi pernyataan tetap
  • CS0213: Anda tidak dapat menggunakan pernyataan tetap untuk mengambil alamat ekspresi yang sudah tetap
  • CS0254: Sisi kanan dari penugasan pernyataan tetap tidak boleh berupa ekspresi cast
  • CS0459: Tidak dapat mengambil alamat variabel lokal baca-saja
  • CS0821: Variabel lokal yang ditik implisit tidak dapat diperbaiki
  • CS1656: Tidak dapat menetapkan ke 'variabel' karena merupakan 'jenis variabel baca-saja'
  • CS8385: Ekspresi yang diberikan tidak dapat digunakan dalam pernyataan tetap

Kesalahan ini terjadi ketika Anda salah menggunakan fixed pernyataan . Pernyataan tersebut fixed mencegah pengumpul sampah merelokasi variabel movable dan mendeklarasikan pointer ke variabel tersebut. Untuk informasi selengkapnya, lihat Kode dan penunjuk yang tidak aman.

Untuk menggunakan pernyataan fixed secara benar:

  • Deklarasikan variabel sebagai jenis pointer (CS0209).
  • Berikan penginisialisasi dalam deklarasi pernyataan fixed (CS0210).
  • Ambil alamat hanya dari ekspresi yang valid: field, variabel lokal, dan penunjuk tidak langsung (CS0211). Jangan mengambil alamat ekspresi komputasi seperti jumlah dua variabel.
  • Gunakan operator address-of pada ekspresi yang tidak tetap hanya dalam penginisialisasi pernyataan fixed (CS0212).
  • Jangan gunakan fixed pernyataan pada ekspresi yang sudah diperbaiki (CS0213). Variabel dan parameter lokal dalam fungsi unsafe sudah dikecualikan pada tumpukan.
  • Jangan gunakan ekspresi cast di sisi kanan pernyataan penetapan fixed (CS0254).
  • Jangan mengambil alamat dari variabel lokal yang bersifat baca-saja (CS0459). Variabel dalam foreach perulangan, using pernyataan, dan fixed pernyataan bersifat baca-saja. Kesalahan ini tidak lagi dihasilkan oleh versi pengkompilasi saat ini.
  • Gunakan jenis eksplisit alih-alih var dalam fixed pernyataan (CS0821).
  • Jangan tetapkan ke variabel dalam konteks baca-saja seperti foreach perulangan, using pernyataan, atau fixed pernyataan (CS1656).
  • Hanya gunakan ekspresi yang mendukung pinning dalam pernyataan fixed (CS8385). Ekspresi harus berupa variabel yang dapat diatasi, string, atau jenis yang mengimplementasikan metode yang sesuai GetPinnableReference .

Persyaratan konteks tidak aman

  • CS0214: Penunjuk dan buffer ukuran tetap hanya dapat digunakan dalam konteks yang tidak aman
  • CS0227: Kode tidak aman hanya dapat muncul jika dikompilasi dengan /unsafe
  • CS0244: Baik 'is' maupun 'as' tidak valid pada jenis penunjuk
  • CS1919: Tipe 'nama tipe' tidak aman tidak dapat digunakan dalam pembuatan objek
  • CS4004: Tidak dapat await dalam konteks yang tidak aman
  • CS9123: Operator '&' tidak boleh digunakan pada parameter atau variabel lokal dalam metode asinkron
  • CS9360: Operasi ini hanya dapat digunakan dalam konteks yang tidak aman
  • CS9361: stackalloc ekspresi tanpa penginisialisasi di dalam SkipLocalsInit hanya dapat digunakan dalam konteks yang tidak aman
  • CS9362: 'anggota' harus digunakan dalam konteks yang tidak aman karena ditandai sebagai 'unsafe'
  • CS9363: 'anggota' harus digunakan dalam konteks yang tidak aman karena memiliki penunjuk dalam tanda tangannya
  • CS9376: Konteks yang tidak aman diperlukan untuk konstruktor 'konstruktor' yang ditandai sebagai 'unsafe' untuk memenuhi batasan 'new()' parameter jenis 'parameter jenis' dalam 'jenis atau metode generik'
  • CS9398: Tidak dapat menggunakan await dalam konteks pernyataan 'fixed'

Diagnostik ini terjadi saat Anda menggunakan konstruksi kode yang tidak aman tanpa konteks yang diperlukan unsafe , atau ketika Anda mencoba operasi yang tidak diizinkan dengan jenis yang tidak aman. Untuk informasi selengkapnya, lihat Kode dan penunjuk yang tidak aman dan kata kuncinyaunsafe.

  • Tandai metode, jenis, atau blok kode yang menggunakan pointer atau buffer ukuran tetap dengan unsafe kata kunci (CS0214). Pengkompilasi memerlukan konteks tidak aman eksplisit untuk kode apa pun yang berfungsi dengan jenis pointer atau bidang buffer ukuran tetap.
  • Aktifkan opsi pengkompilasi AllowUnsafeBlocks di pengaturan proyek Anda (CS0227). Tanpa opsi ini, pengkompilasi menolak semua unsafe blok bahkan jika kodenya benar.
  • Jangan gunakan is operator atau as dengan jenis pointer (CS0244). Operator pengujian jenis ini tidak valid untuk penunjuk karena penunjuk tidak berpartisipasi dalam hierarki jenis.
  • Jangan gunakan new operator untuk membuat instans jenis pointer (CS1919). Untuk membuat objek dalam memori yang tidak dikelola, gunakan interop untuk memanggil metode asli yang mengembalikan pointer.
  • Perlakukan CS4004 sebagai panduan warisan. Di C# 14 dan yang lebih lama, await di dalam konteks yang tidak aman tidak diizinkan. Dalam perubahan keamanan memori pada versi pratinjau C# 15, await diizinkan dalam konteks unsafe, sehingga pembatasan menyeluruh ini tidak lagi mencerminkan aturan yang berlaku saat ini.
  • Jangan gunakan alamat operator (&) pada parameter atau variabel lokal dalam metode asinkron (CS9123). Variabel mungkin tidak ada pada tumpukan ketika operasi asinkron dilanjutkan setelah titik penangguhan.
  • Tandai operasi yang melibatkan konstruksi yang tidak aman (seperti dereferensi pointer, alamat, atau sizeof pada jenis yang tidak dikelola) dengan unsafe kata kunci (CS9360). Di bawah aturan keamanan memori C# 15 yang diperbarui, pengkompilasi mengidentifikasi operasi individual yang memerlukan konteks yang tidak aman.
  • unsafe Gunakan kata kunci untuk ekspresi stackalloc tanpa penginisialisasi ketika atribut SkipLocalsInit diterapkan (CS9361). Tanpa penginisialisasi, memori yang dialokasikan pada tumpukan mengandung data yang belum diinisialisasi, yang merupakan operasi tidak aman.
  • unsafe Gunakan konteks saat memanggil anggota yang ditandai unsafe (CS9362), atau anggota dengan pointer dalam tanda tangan mereka (CS9363). Di bawah model keamanan memori yang diperbarui, kompilator melaporkan CS9362 untuk anggota yang secara eksplisit menyebarkan kewajiban keamanan kepada pemanggil dan CS9363 untuk kasus kompatibilitas warisan di mana tanda tangan itu sendiri berisi pointer.
  • Gunakan konteks unsafe saat batasan new() mengharuskan pemanggilan konstruktor yang ditandai unsafe (CS9376). Instansiasi generik memanggil konstruktor secara implisit, sehingga konteks panggilan harus tidak aman.
  • Pindah await ke luar isi atau inisialisasi fixed pernyataan (CS9398). Versi pratinjau C# 15 memungkinkan await dalam konteks unsafe, tetapi durasi pinning dari pernyataan fixed masih tidak dapat melintasi titik penangguhan asinkron. Tunggu hingga operasi selesai sebelum masuk ke fixed, atau keluar dari pernyataan fixed sebelum menunggu.

Kontrak keselamatan anggota tidak aman

  • CS9364: Anggota 'anggota' yang tidak aman tidak dapat mengganti anggota 'anggota' yang aman
  • CS9365: Anggota 'anggota' yang tidak aman tidak dapat secara implisit mengimplementasikan anggota 'anggota' yang aman
  • CS9366: Anggota 'anggota' yang tidak terjamin tidak dapat menerapkan anggota 'anggota' yang terjamin
  • CS9367: RequiresUnsafeAttribute tidak dapat diterapkan ke simbol ini.
  • CS9368: RequiresUnsafeAttribute hanya berlaku di bawah aturan keamanan memori yang diperbarui.
  • CS9377: Pengubah 'unsafe' tidak memiliki efek apa pun di sini di bawah aturan keamanan memori saat ini.
  • CS9379: Jangan gunakan 'RequiresUnsafeAttribute' di sumber; gunakan pengubah 'unsafe' sebagai gantinya.
  • CS9388: Pengubah 'safe' hanya dapat digunakan pada anggota 'extern' yang tidak ditandai 'unsafe'.
  • CS9389: 'extern' anggota harus ditandai 'unsafe' atau 'safe'.
  • CS9390: Kedua deklarasi anggota parsial harus ditandai 'safe' atau tidak boleh ditandai 'safe'
  • CS9396: Tidak dapat menetapkan pengubah 'unsafe' atau 'safe' baik pada properti atau pengindeks 'property' maupun pada pengaksesnya. Hapus salah satunya.
  • CS9397: Tidak dapat menentukan pengubah 'unsafe' atau 'safe' yang sama pada semua aksesor properti atau pengindeks 'properti'. Sebagai gantinya, letakkan pengubah itu pada properti itu sendiri.

Diagnostik ini memberlakukan aturan kontrak keselamatan C# 15 untuk anggota yang ditandai sebagai tidak aman. Kompilator memastikan bahwa anggota yang tidak aman tidak melanggar harapan keselamatan yang ditetapkan oleh kelas dasar dan antarmuka. Untuk informasi selengkapnya, lihat Kode dan penunjuk yang tidak aman dan kata kuncinyaunsafe.

  • Jangan ambil alih anggota basis aman dengan anggota yang tidak aman (CS9364). Penggantian harus mempertahankan kontrak keselamatan anggota basis. Jika anggota dasar aman, penggantian juga harus aman. Hapus pengubah unsafe atau RequiresUnsafeAttribute dari anggota pengganti, atau tandai anggota dasar sebagai tidak aman.
  • Jangan menerapkan anggota antarmuka yang aman secara implisit dengan anggota yang tidak aman (CS9365). Ketika tipe secara implisit mengimplementasikan anggota antarmuka, pemanggil melalui antarmuka mengharapkan operasi yang aman. Hapus penetapan yang tidak aman dari anggota pelaksana, atau gunakan implementasi antarmuka eksplisit.
  • Jangan mengimplementasikan anggota antarmuka yang aman secara eksplisit menggunakan anggota yang tidak aman (CS9366). Bahkan dengan implementasi eksplisit, kontrak keselamatan anggota antarmuka harus dipertahankan.
  • Terapkan RequiresUnsafeAttribute hanya untuk jenis simbol yang didukung (CS9367). Atribut ini dapat diterapkan ke metode, properti, peristiwa, konstruktor, dan jenis, tetapi tidak semua jenis simbol mendukungnya.
  • Aktifkan aturan keamanan memori yang diperbarui untuk digunakan RequiresUnsafeAttribute (CS9368). Atribut ini adalah bagian dari model keamanan memori halus C# 15 dan tidak dikenali di bawah aturan warisan. Pastikan proyek Anda menargetkan versi bahasa yang mendukung aturan yang diperbarui.
  • Hapus pengubah unsafe ketika tidak berpengaruh (CS9377). Di bawah aturan keamanan memori saat ini, konteks tertentu tidak memerlukan atau mendapatkan manfaat dari pengubah unsafe . Pengompilasi memperingatkan ketika pengubah tidak berarti sehingga Anda dapat membersihkan anotasi yang tidak perlu.
  • Gunakan pengubah unsafe langsung pada deklarasi anggota alih-alih diterapkan RequiresUnsafeAttribute di sumber (CS9379). Atribut hanya ditujukan untuk representasi metadata; dalam kode sumber, unsafe kata kunci adalah mekanisme yang benar.
  • Terapkan modifier safe hanya pada anggota extern yang belum ditandai unsafe (CS9388). Pengubah safe secara eksplisit memilih anggota ekstern dari asumsi default yang tidak aman untuk deklarasi ekstern.
  • Tandai setiap anggota extern sebagai unsafe atau safe (CS9389). Di bawah aturan keamanan memori yang diperbarui, anggota extern harus secara eksplisit menyatakan kontrak keselamatan mereka karena kompilator tidak dapat memverifikasi implementasi.
  • Pastikan kedua deklarasi anggota parsial cocok dengan modifier safe (CS9390). Jika satu deklarasi parsial ditandai safe, yang lain juga harus ditandai safe untuk mempertahankan kontrak keselamatan yang konsisten.
  • Letakkan unsafe atau safe pada properti atau pengindeks, atau pada aksesor, tetapi tidak keduanya (CS9396). Jika properti menetapkan kontrak untuk semua aksesor, tempatkan pengubah pada properti itu sendiri. Jika hanya satu aksesor yang berbeda, letakkan pengubah pada aksesor tersebut dan biarkan properti tidak dimodifikasi.
  • Jika setiap accessor dari properti atau pengindeks memiliki modifier safe atau unsafe yang sama, pindahkan modifier tersebut ke deklarasi properti atau pengindeks (CS9397). Gunakan modifier aksesor hanya jika aksesor tersebut memang dibuat berbeda.

Bidang tata letak eksplisit atau diperluas

  • CS9392: Bidang dalam jenis tata letak eksplisit atau diperluas harus ditandai 'unsafe' atau 'safe'.

Diagnostik ini terjadi di bawah model keamanan memori yang diperbarui ketika bidang instans berpartisipasi dalam tata letak eksplisit atau diperluas dan deklarasi tidak mengatakan apakah bidang tersebut unsafe atau safe. Untuk informasi selengkapnya, lihat Kode dan penunjuk yang tidak aman dan kata kuncinyasafe.

  • Tandai setiap bidang instans dalam jenis dengan [StructLayout(LayoutKind.Explicit)] atau [ExtendedLayout] sebagai unsafe atau safe (CS9392). Jika medan dihasilkan secara sintetis untuk properti otomatis, properti yang didukung oleh medan, parameter konstruktor utama, atau event mirip medan, letakkan modifier pada properti, parameter, atau event yang memiliki medan yang dihasilkan tersebut.

Buffer ukuran tetap

  • CS1641: Bidang buffer berukuran tetap harus memiliki spesifikasi ukuran array setelah nama bidang
  • CS1642: Field buffer berukuran tetap hanya dapat menjadi anggota struktur
  • CS1663: Jenis buffer ukuran tetap harus salah satu dari yang berikut ini: bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, float, atau double
  • CS1664: Buffer berukuran tetap dengan panjang 'length' dan tipe 'type' terlalu besar
  • CS1665: Buffer ukuran tetap harus memiliki panjang yang lebih besar dari nol
  • CS1666: Anda tidak dapat menggunakan buffer ukuran tetap yang terkandung dalam ekspresi yang tidak difiks. Coba gunakan pernyataan tetap.
  • CS1708: Buffer ukuran tetap hanya dapat diakses melalui lokal atau bidang
  • CS1716: Jangan gunakan atribut ''System.Runtime.CompilerServices.FixedBuffer. Gunakan pengubah bidang 'tetap' sebagai gantinya.
  • CS7092: Buffer tetap mungkin hanya memiliki satu dimensi.
  • CS8372: Jangan gunakan atribut 'System.Runtime.CompilerServices.FixedBuffer' pada properti
  • CS9049: Bidang tetap tidak boleh menjadi bidang ref.

Kesalahan ini terjadi ketika Anda bekerja dengan buffer ukuran tetap. Buffer ukuran tetap adalah array yang disematkan langsung dalam struktur dan digunakan terutama untuk skenario interoperabilitas. Untuk informasi selengkapnya, lihat Buffer ukuran tetap.

Untuk mendeklarasikan dan menggunakan buffer ukuran tetap dengan benar:

  • Tentukan ukuran array setelah nama bidang menggunakan konstanta bilangan bulat positif (CS1641, CS1665). Ukuran total buffer (jumlah elemen dikalikan dengan ukuran elemen) tidak boleh melebihi 2^31 byte (CS1664).
  • Deklarasikan buffer ukuran tetap hanya dalam struktur, bukan di kelas (CS1642). Gunakan array reguler jika Anda memerlukan bidang dalam kelas.
  • Gunakan salah satu jenis elemen yang didukung: bool, , byte, short, intlong, char, sbyte, ushort, uint, ulong, float, , atau double (CS1663).
  • Gunakan pernyataan fixed untuk menyematkan struct yang berisi sebelum mengakses buffer (CS1666).
  • Akses buffer ukuran tetap hanya melalui variabel lokal atau field, bukan melalui ekspresi menengah (CS1708).
  • Gunakan pengubah fixed bidang alih-alih System.Runtime.CompilerServices.FixedBuffer atribut (CS1716). Jangan terapkan atribut ini ke properti juga (CS8372).
  • Deklarasikan buffer tetap hanya dengan satu dimensi (CS7092). Buffer statis multidimensi tidak didukung.
  • Jangan mendeklarasikan buffer ukuran tetap sebagai ref bidang (CS9049). Buffer ukuran tetap harus berupa bidang nilai.

Penunjuk fungsi

  • CS8812: Tidak dapat mengonversi &metode grup 'metode' ke tipe penunjuk non-fungsi 'type'.

Untuk mendapatkan penunjuk fungsi, gunakan alamat operator dengan jenis penunjuk fungsi eksplisit yang dilemparkan. Jangan gunakan operator alamat & untuk menetapkan kelompok metode ke void* atau jenis penunjuk non-fungsi lain. Untuk informasi selengkapnya, lihat Penunjuk fungsi.