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.
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
fixedpernyataan harus merupakan jenis penunjuk -
CS0210: Anda harus memberikan penginisialisasi dalam deklarasi pernyataan
fixedatauusing - CS0211: Tidak dapat mengambil alamat ekspresi yang diberikan
-
CS0212: Anda hanya dapat mengambil alamat ekspresi yang tidak difiks di dalam
fixedpenginisialisasi pernyataan -
CS0213: Anda tidak dapat menggunakan
fixedpernyataan 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, ataufloat,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
awaitdalam 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:
stackallocekspresi tanpa penginisialisasi di dalamSkipLocalsInithanya 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:
RequiresUnsafeAttributetidak dapat diterapkan ke simbol ini. -
CS9368:
RequiresUnsafeAttributehanya 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.
-
sizeofGunakan operator dalamunsafekonteks 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
usingpernyataan - 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
fixedpernyataan pada ekspresi yang sudah diperbaiki (CS0213). Variabel dan parameter lokal dalam fungsiunsafesudah 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
foreachperulangan,usingpernyataan, danfixedpernyataan bersifat baca-saja. Kesalahan ini tidak lagi dihasilkan oleh versi pengkompilasi saat ini. - Gunakan jenis eksplisit alih-alih
vardalamfixedpernyataan (CS0821). - Jangan tetapkan ke variabel dalam konteks baca-saja seperti
foreachperulangan,usingpernyataan, ataufixedpernyataan (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 sesuaiGetPinnableReference.
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
awaitdalam 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:
stackallocekspresi tanpa penginisialisasi di dalamSkipLocalsInithanya 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
unsafekata 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
unsafeblok bahkan jika kodenya benar. - Jangan gunakan
isoperator atauasdengan jenis pointer (CS0244). Operator pengujian jenis ini tidak valid untuk penunjuk karena penunjuk tidak berpartisipasi dalam hierarki jenis. - Jangan gunakan
newoperator 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,
awaitdi dalam konteks yang tidak aman tidak diizinkan. Dalam perubahan keamanan memori pada versi pratinjau C# 15,awaitdiizinkan 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
sizeofpada jenis yang tidak dikelola) denganunsafekata kunci (CS9360). Di bawah aturan keamanan memori C# 15 yang diperbarui, pengkompilasi mengidentifikasi operasi individual yang memerlukan konteks yang tidak aman. -
unsafeGunakan kata kunci untuk ekspresistackalloctanpa penginisialisasi ketika atributSkipLocalsInitditerapkan (CS9361). Tanpa penginisialisasi, memori yang dialokasikan pada tumpukan mengandung data yang belum diinisialisasi, yang merupakan operasi tidak aman. -
unsafeGunakan konteks saat memanggil anggota yang ditandaiunsafe(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
unsafesaat batasannew()mengharuskan pemanggilan konstruktor yang ditandaiunsafe(CS9376). Instansiasi generik memanggil konstruktor secara implisit, sehingga konteks panggilan harus tidak aman. - Pindah
awaitke luar isi atau inisialisasifixedpernyataan (CS9398). Versi pratinjau C# 15 memungkinkanawaitdalam konteks unsafe, tetapi durasi pinning dari pernyataanfixedmasih tidak dapat melintasi titik penangguhan asinkron. Tunggu hingga operasi selesai sebelum masuk kefixed, atau keluar dari pernyataanfixedsebelum 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:
RequiresUnsafeAttributetidak dapat diterapkan ke simbol ini. -
CS9368:
RequiresUnsafeAttributehanya 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
unsafeatauRequiresUnsafeAttributedari 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
RequiresUnsafeAttributehanya 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
unsafeketika tidak berpengaruh (CS9377). Di bawah aturan keamanan memori saat ini, konteks tertentu tidak memerlukan atau mendapatkan manfaat dari pengubahunsafe. Pengompilasi memperingatkan ketika pengubah tidak berarti sehingga Anda dapat membersihkan anotasi yang tidak perlu. - Gunakan pengubah
unsafelangsung pada deklarasi anggota alih-alih diterapkanRequiresUnsafeAttributedi sumber (CS9379). Atribut hanya ditujukan untuk representasi metadata; dalam kode sumber,unsafekata kunci adalah mekanisme yang benar. - Terapkan modifier
safehanya pada anggotaexternyang belum ditandaiunsafe(CS9388). Pengubahsafesecara eksplisit memilih anggota ekstern dari asumsi default yang tidak aman untuk deklarasi ekstern. - Tandai setiap anggota
externsebagaiunsafeatausafe(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 ditandaisafe, yang lain juga harus ditandaisafeuntuk mempertahankan kontrak keselamatan yang konsisten. - Letakkan
unsafeatausafepada 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
safeatauunsafeyang 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]sebagaiunsafeatausafe(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, ataudouble - 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, , ataudouble(CS1663). - Gunakan pernyataan
fixeduntuk 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
fixedbidang alih-alihSystem.Runtime.CompilerServices.FixedBufferatribut (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
refbidang (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.