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.
Kesalahan berikut dapat dihasilkan saat Anda bekerja dengan variabel referensi:
-
CS0192: Bidang
readonlytidak dapat digunakan sebagairefnilai atauout(kecuali dalam konstruktor) -
CS0199: Bidang
static readonlytidak dapat digunakan sebagairefnilai atauout(kecuali dalam konstruktor statis) -
CS0206: Properti atau pengindeks yang tidak dikembalikan ref mungkin tidak digunakan sebagai nilai
outatauref -
CS0631:
refdanouttidak valid dalam konteks ini -
CS0767: Tidak dapat mewarisi antarmuka dengan parameter jenis yang ditentukan karena menyebabkan metode berisi kelebihan beban yang hanya berbeda pada
refdanout -
CS1510: A
refatauoutnilai harus berupa variabel yang dapat ditetapkan -
CS1605: Tidak dapat menggunakan variabel sebagai
refnilai atauoutkarena bersifat baca-saja -
CS1623: Iterator tidak dapat memiliki
refparameter ,inatauout -
CS1649: Anggota field
readonlytidak dapat digunakan sebagai nilairefatauout(kecuali dalam konstruktor) -
CS1651: Bidang dari field hanya-baca statis tidak dapat digunakan sebagai nilai
refatauout(kecuali dalam konstruktor statis) -
CS1655: Tidak dapat menggunakan field dengan tipe sebagai nilai
refatauout -
CS1657: Tidak dapat menggunakan variabel sebagai
refnilai atauout -
CS1741: A
refatauoutparameter tidak dapat memiliki nilai default -
CS1939: Tidak dapat meneruskan variabel rentang sebagai
outparameter atauref -
CS1988: Metode asinkron tidak dapat memiliki
refparameter ,inatauout -
CS7084: Kejadian Windows Runtime tidak dapat diteruskan sebagai parameter
outatauref. - CS8196: Referensi ke variabel yang ditik secara implisit tidak diizinkan dalam daftar argumen yang sama.
-
CS8325: '
await' tidak dapat digunakan dalam ekspresi yang berisi operator bersyarahref - CS8326: Kedua nilai operator kondisional harus berupa nilai ref atau keduanya tidak boleh berupa nilai ref
- CS8327: Ekspresi harus berjenis benar agar sesuai dengan nilai ref alternatif
-
CS8329: Tidak dapat menggunakan variabel sebagai nilai
refatauoutkarena variabel tersebut bersifat hanya baca -
CS8330: Anggota dari variabel tidak dapat digunakan sebagai
refatau nilaioutkarena merupakan variabel hanya-baca -
CS8331: Tidak dapat menetapkan nilai ke variabel atau menggunakannya sebagai ruas kanan penetapan
refkarena variabel tersebut bersifat baca-saja -
CS8332: Tidak dapat menetapkan nilai ke anggota variabel atau menggunakannya sebagai ruas kanan dari penugasan
refkarena variabel tersebut bersifat hanya-baca -
CS8337: Parameter pertama metode ekstensi '
ref' harus berupa jenis nilai atau jenis generik yang dibatasi untuk distruksi. -
CS8338: Parameter '
in' atau 'ref readonly' pertama dari metode ekstensi harus berupa jenis nilai beton (non-generik). -
CS8373: Sisi kiri dari penetapan
refharus berupa variabel ref. -
CS8388: Variabel
outtidak dapat dinyatakan sebagai lokal ref -
CS8977: Tidak dapat menggunakan '
ref', 'in', atau 'out' dalam tanda tangan metode yang dikaitkan dengan 'UnmanagedCallersOnly'. - CS8986: Pengubah parameter 'berlingkup' tidak cocok dengan target.
- CS8987: Pengubah parameter 'scoped' tidak sesuai dengan anggota yang ditimpa atau diimplementasikan.
- CS9061: Pengubah 'scoped' tidak dapat digunakan dengan diabaikan.
- CS9062: Jenis dan alias tidak dapat diberi nama 'scoped'.
- CS9063: UnscopedRefAttribute tidak dapat diterapkan ke parameter ini karena tidak dilingkupkan secara default.
- CS9065: Jangan gunakan 'System.Runtime.CompilerServices.ScopedRefAttribute'. Gunakan kata kunci 'terlingkup' sebagai gantinya.
- CS9066: UnscopedRefAttribute tidak dapat diterapkan ke parameter yang memiliki pengubah 'cakupan'.
- CS9072: Variabel dekonstruksi tidak dapat dinyatakan sebagai lokal ref
- CS9101: UnscopedRefAttribute hanya dapat diterapkan pada metode dan properti instans dari struct atau antarmuka virtual, dan tidak dapat diterapkan pada konstruktor atau anggota init-only.
- CS9102: UnscopedRefAttribute tidak dapat diterapkan ke implementasi antarmuka karena anggota yang diimplementasikan tidak memiliki atribut ini.
-
CS9104: Sumber daya pernyataan dengan tipe
usingtidak dapat digunakan dalam metode async atau ekspresi lambda async. -
CS9190:
readonlypengubah harus ditentukan setelahref. -
CS9199: Parameter
ref readonlytidak dapat memiliki atribut Out.
Peringatan berikut dihasilkan ketika variabel referensi salah digunakan:
- CS9073: Pengubah 'lingkup' dari parameter tidak cocok dengan target.
- CS9074: Pengubah 'scoped' pada parameter tidak sesuai dengan anggota yang dioverride atau diimplementasikan.
-
CS9191: Pengubah
refuntuk argumen yang sesuai denganinparameter setara denganin. Pertimbangkan untuk menggunakaninsebagai gantinya. -
CS9192: Argumen harus diteruskan dengan
refatauinkata kunci. -
CS9193: Argumen harus menjadi variabel karena diteruskan ke
ref readonlyparameter -
CS9195: Argumen harus diteruskan dengan
inkata kunci - CS9196: Modifier jenis referensi parameter tidak cocok dengan parameter terkait dalam anggota yang dioverride atau diimplementasikan.
- CS9197: Pengubah jenis referensi parameter tidak cocok dengan parameter yang sesuai di anggota tersembunyi.
- CS9198: Pengubah jenis referensi parameter tidak cocok dengan parameter yang sesuai dalam target.
-
CS9200: Nilai default ditentukan untuk
ref readonlyparameter, tetapiref readonlyharus digunakan hanya untuk referensi. Pertimbangkan untuk mendeklarasikan parameter sebagaiin. - CS9201: Bidang Ref harus ditetapkan ulang sebelum digunakan.
- CS9265: Bidang tidak pernah ditetapkan ulang, dan akan selalu memiliki nilai defaultnya (referensi null)
Kesalahan dan peringatan ini mengikuti tema berikut:
- Sintaks yang salah: Sintaksis deklarasi atau penggunaan Anda tidak valid.
-
Konstruksi bahasa di mana
refvariabel tidak valid: Beberapa idiom C# tidak mengizinkan variabel. Biasanya ini karena analisis keamanan ref tidak dapat dilakukan dengan andal. - Ekspresi nilai yang digunakan di mana variabel referensi diperlukan: Ekspresi yang digunakan sebagai variabel referensi harus berupa variabel, bukan ekspresi nilai.
- Variabel referensi yang dapat ditulisi yang merujuk ke variabel baca-saja: Referensi ke variabel baca-saja tidak dapat diteruskan melalui referensi yang dapat ditulisi.
Artikel ini menggunakan istilah variabel referensi sebagai istilah umum untuk parameter yang dideklarasikan dengan salah satu pengubah in, ref readonly, ref, atau out, atau variabel lokal ref, bidang ref dalam ref struct, atau nilai balik ref. Variabel referensi mengacu pada variabel lain, yang disebut referensi.
Sintaksis yang salah
Kesalahan ini menunjukkan bahwa Anda menggunakan sintaksis yang salah mengenai variabel referensi:
-
CS8373: Ruas
refkiri dari penugasan harus berupa variabel ref. -
CS8388: Variabel
outtidak dapat dinyatakan sebagai lokal ref. -
CS9190:
readonlypengubah harus ditentukan setelahref.
Untuk memperbaiki kesalahan ini:
- Pastikan bahwa operand kiri dari operator
= refadalah variabel referensi, bukan ekspresi nilai atau variabel lokal non-referensi. Penetapan ref mengharuskan kedua sisi menjadi variabel referensi yang dapat membuat alias ke lokasi penyimpanan yang sama (CS8373). - Saat mendeklarasikan parameter referensi, tulis pengubah sebagai
ref readonlybukanreadonly ref. Spesifikasi bahasa C# memerlukanrefkata kunci untuk mendahuluireadonlypengubah dalam deklarasi parameter untuk mempertahankan sintaks yang konsisten di semua jenis parameter referensi (CS9190). -
refGunakan kata kunci alih-alihoutsaat mendeklarasikan variabel referensi lokal.outsecara eksklusif adalah pengubah parameter yang menunjukkan metode harus menetapkan nilai sebelum mengembalikan, sedangkanrefadalah kata kunci yang sesuai untuk membuat variabel lokal yang alias lokasi penyimpanan lainnya (CS8388). Untuk informasi selengkapnya tentang variabel referensi dan persyaratan sintaksnya, lihat variabel referensi dan Spesifikasi Bahasa C#.
Pembatasan variabel referensi
Kesalahan berikut menunjukkan bahwa variabel referensi tidak dapat digunakan di mana Anda memilikinya:
-
CS0631:
refdanouttidak valid dalam konteks ini -
CS0767: Tidak dapat mewarisi antarmuka dengan parameter tipe yang ditentukan karena menyebabkan metode memiliki overload yang hanya berbeda dalam
refdanout -
CS1623: Iterator tidak dapat memiliki
refparameter ,inatauout -
CS1741: A
refatauoutparameter tidak dapat memiliki nilai default -
CS1939: Tidak dapat meneruskan variabel rentang sebagai
outparameter atauref -
CS1988: Metode asinkron tidak dapat memiliki
refparameter ,inatauout -
CS7084: Kejadian Windows Runtime tidak dapat diteruskan sebagai parameter
outatauref. -
CS8196: Referensi ke variabel yang ditik
outimplisit tidak diizinkan dalam daftar argumen yang sama. -
CS8325: 'await' tidak dapat digunakan dalam ekspresi yang berisi operator bersyarah
ref - CS8326: Kedua nilai operator kondisional harus berupa nilai ref atau keduanya tidak boleh berupa nilai ref
- CS8327: Ekspresi harus berjenis benar agar sesuai dengan nilai ref alternatif
-
CS8337: Parameter pertama metode ekstensi '
ref' harus berupa jenis nilai atau jenis generik yang dibatasi untuk distruksi. -
CS8338: Parameter '
in' atau 'ref readonly' pertama dari metode ekstensi harus berupa jenis nilai beton (non-generik). -
CS8977: Tidak dapat menggunakan '
ref', 'in', atau 'out' dalam tanda tangan metode yang dikaitkan dengan 'UnmanagedCallersOnly'. - CS9072: Variabel dekonstruksi tidak dapat dinyatakan sebagai lokal ref
-
CS9104: Sumber daya pernyataan bertipe
usingtidak dapat digunakan dalam metode async atau ekspresi lambda async. -
CS9199: Parameter
ref readonlytidak dapat memiliki atribut Out.
Peringatan berikut menunjukkan bahwa variabel referensi tidak boleh digunakan, dan mungkin tidak aman:
- CS9196: Modifier jenis referensi parameter tidak cocok dengan parameter terkait pada anggota yang ditimpa atau diimplementasikan.
- CS9197: Pengubah jenis referensi parameter tidak cocok dengan parameter yang sesuai di anggota tersembunyi.
- CS9198: Pengubah jenis referensi parameter tidak cocok dengan parameter yang sesuai dalam target.
-
CS9200: Nilai default ditentukan untuk
ref readonlyparameter, tetapiref readonlyharus digunakan hanya untuk referensi. Pertimbangkan untuk mendeklarasikan parameter sebagaiin. - CS9201: Bidang Ref harus ditetapkan ulang sebelum digunakan.
- CS9265: Bidang tidak pernah ditetapkan ulang, dan akan selalu memiliki nilai defaultnya (referensi null)
Untuk memperbaiki kesalahan ini:
- Hapus parameter referensi dari pengindeks. Pengindeks dirancang untuk menyediakan sintaks akses seperti array dan pengkompilasi tidak dapat menjamin pelacakan masa pakai yang aman untuk referensi yang diteruskan melalui aksesor pengindeks (CS0631, CS1623).
- Hapus parameter referensi dari metode iterator. Iterator menjalankan kode dengan malas di beberapa panggilan menggunakan komputer status, dan pengkompilasi tidak dapat memastikan variabel yang direferensikan tetap valid di seluruh batas pengembalian hasil di mana eksekusi ditangguhkan dan dilanjutkan (CS1623).
- Hapus parameter referensi dari metode asinkron. Metode asinkron dapat menangguhkan eksekusi pada titik tunggu dan melanjutkan pada utas yang berbeda, sehingga tidak mungkin untuk menjamin bahwa variabel yang dirujuk tetap valid dan dapat diakses sepanjang eksekusi metode (CS1988).
- Hindari menggunakan ekspresi tunggu di dalam ekspresi bersyariah ref. Operasi tunggu mungkin menangguhkan eksekusi dan membatalkan referensi yang dipilih oleh operator kondisional, yang mengarah ke potensi penggunaan referensi yang tidak valid saat eksekusi dilanjutkan (CS8325).
- Pastikan kedua cabang operator bersyarat ref mengembalikan referensi atau tidak mengembalikan referensi, dan ketika keduanya adalah referensi, mereka harus memiliki jenis yang sama. Operator kondisional harus menghasilkan jenis hasil yang konsisten yang dapat digunakan dengan aman oleh kode panggilan terlepas dari cabang mana yang dipilih (CS8326, CS8327).
- Hapus nilai default dari
refparameter danout. Parameter referensi harus selalu disediakan di situs panggilan untuk membuat hubungan alias yang diperlukan antara parameter dan variabel yang ada, membuat nilai default secara semantik tidak berarti (CS1741). - Hindari mendeklarasikan
outvariabel yang diketik secara implisit dalam daftar argumen yang juga mereferensikan variabel yang sama. Pengompilasi harus menyimpulkan jenis variabel dari tanda tangan metode sambil memvalidasi penggunaan variabel tersebut secara bersamaan dalam ekspresi yang sama, membuat dependensi melingkar (CS8196). - Jangan meneruskan variabel rentang kueri LINQ sebagai parameter referensi. Variabel rentang adalah variabel iterasi yang dihasilkan kompilator yang masa pakainya dikelola oleh model eksekusi kueri dan tidak memiliki lokasi memori stabil yang dapat dirujuk dengan aman (CS1939).
- Gunakan variabel nilai reguler alih-alih lokal ref saat mendekonstruksi objek. Dekonstruksi membuat variabel baru untuk menerima nilai yang didekonstruksi dan variabel referensi akan mencoba alias nilai sementara ini daripada menyimpannya secara independen (CS9072).
- Hindari mengimplementasikan beberapa antarmuka di mana metode hanya berbeda dengan pengubah parameter
refdanout. Spesifikasi bahasa C# memperlakukan ini sebagai tanda tangan yang berbeda tetapi tidak memberikan cara untuk membedakan implementasi mana yang harus dipanggil karena keduanyarefdanoutberbagi sintaks panggilan yang sama pada batas implementasi (CS0767). - Hapus parameter referensi dari metode yang dihiasi dengan System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute. Metode ini dapat dipanggil dari kode tidak terkelola yang tidak memahami aturan keamanan referensi C#dan tidak dapat menjamin manajemen seumur hidup yang tepat dari variabel yang direferensikan di seluruh batas terkelola/tidak dikelola (CS8977).
- Gunakan pengubah
refpada parameter pertama metode ekstensi hanya untuk jenis nilai atau jenis generik yang dibatasi untuk jenis nilai. Jenis referensi sudah diteruskan sebagai referensi di tingkat CLR dan menambahkanrefakan membuat referensi ke referensi, sementara ekstensi jenis nilai denganrefmemungkinkan mutasi instans yang diperluas (CS8337, CS8338). - Jangan meneruskan event Windows Runtime sebagai parameter referensi. Peristiwa ini mengikuti sistem tipe Windows Runtime, yang memiliki semantik masa pakai dan threading yang berbeda dari referensi .NET dan tidak mendukung perilaku alias yang diperlukan oleh parameter referensi C# (CS7084).
- Hapus System.Runtime.InteropServices.OutAttribute dari parameter
ref readonly. Atribut ini dirancang untuk penanganan semantik dalam konteks pemanggilan platform di mana arah parameter hanya untuk keluar, yang bertentangan denganref readonlyjaminan bahwa parameter referensikan data yang ada yang tidak boleh diubah (CS9199). - Pastikan semua
refbidang dalam jenis ditetapkan baik di penginisialisasi bidang atau di semua jalur kode konstruktor sebelum konstruktor selesai. Bidang ref yang tidak diinisialisasi akan berisi referensi yang tidak valid yang dapat menyebabkan kerusakan memori jika diakses (CS9201, CS9265). - Cocokkan pengubah jenis referensi (
ref,in,out,ref readonly) antara metode dan metode dasar yang di-override atau metode antarmuka yang diimplementasikan. Pengubah referensi adalah bagian dari kontrak tanda tangan metode yang harus dipatuhi oleh jenis turunan untuk mempertahankan kesubstitusian dan ekspektasi pemanggil (CS9196, CS9197, CS9198). - Deklarasikan parameter sebagai
inbukanref readonlysaat memberikan nilai default.ref readonlydirancang untuk skenario di mana pemanggil meneruskan referensi ke variabel yang ada, sedangkaninparameter dapat menerima referensi dan salinan nilai sementara, membuat nilai default bermakna (CS9200).
Untuk informasi selengkapnya tentang di mana variabel referensi diizinkan, lihat Parameter metode, Iterator, pola pemrograman asinkron, dan Spesifikasi Bahasa C#.
unscoped ref pembatasan
Kualifikasi unscoped pada ref parameter tidak diizinkan di beberapa lokasi:
- CS9101: UnscopedRefAttribute hanya dapat diterapkan pada instance struktur atau metode dan properti antarmuka virtual, dan tidak dapat diterapkan pada konstruktor atau anggota yang hanya bersifat inisialisasi.
- CS9102: UnscopedRefAttribute tidak dapat diterapkan ke implementasi antarmuka karena anggota yang diimplementasikan tidak memiliki atribut ini.
Untuk memperbaiki kesalahan ini:
- Hapus pengubah
unscopedatau System.Diagnostics.CodeAnalysis.UnscopedRefAttribute atribut dari konstruktor struct dan anggota init-only. Anggota ini memiliki semantik inisialisasi khusus di mana pengkompilasi harus memastikan bahwa referensi apa pun tidak melampaui fase inisialisasi, dan memungkinkan referensi yang tidak tercakup akan melanggar jaminan bahwa inisialisasi selesai sebelum struktur dapat diakses sepenuhnya (CS9101). - Hapus pengubah
unscopeddari metode implementasi antarmuka saat metode antarmuka yang sesuai tidak memilikinya. Karakteristik yang tidak tercakup memengaruhi kontrak metode mengenai jaminan masa pakai referensi, dan implementasi harus mempertahankan kontrak yang sama dengan antarmuka yang mereka terapkan untuk memastikan penelepon dapat mengandalkan perilaku seumur hidup yang konsisten terlepas dari implementasi mana yang dipanggil (CS9102).
Untuk informasi selengkapnya tentang referensi terlingkup dan tidak terlingkup, lihat Parameter metode dan Batasan konteks aman dalam spesifikasi bahasa C#.
Variabel referensi memerlukan referensi
Anda harus menyediakan variabel sebagai argumen ke parameter referensi, pengembalian referensi, atau penetapan lokal ref:
-
CS0206: Properti atau pengindeks yang tidak dikembalikan ref mungkin tidak digunakan sebagai nilai
outatauref -
CS1510: A
refatauoutnilai harus berupa variabel yang dapat ditetapkan
Peringatan:
-
CS9191: Pengubah
refuntuk argumen yang sesuai denganinparameter setara denganin. Pertimbangkan untuk menggunakaninsebagai gantinya. -
CS9192: Argumen harus diteruskan dengan
refatauinkata kunci. -
CS9193: Argumen harus menjadi variabel karena diteruskan ke
ref readonlyparameter -
CS9195: Argumen harus diteruskan dengan
inkata kunci
Untuk memperbaiki kesalahan ini:
- Simpan hasil akses properti atau pengindeks dalam variabel lokal sebelum meneruskannya sebagai parameter referensi. Properti dan pengindeks adalah metode yang mengembalikan nilai daripada menyediakan akses langsung ke lokasi penyimpanan, dan parameter referensi memerlukan variabel aktual dengan lokasi memori stabil yang dapat diberi alias (CS0206, CS1510).
- Gunakan pengubah
inalih-alihrefsaat meneruskan argumen keinparameter. Meskipunrefsecara teknis berfungsi karena kompatibilitas mundur, pengubahinlebih jelas mengekspresikan niat bahwa argumen bersifat baca-saja dan dapat diteruskan lebih efisien sebagai referensi tanpa menyalin (CS9191, CS9195). - Tambahkan pengubah referensi yang sesuai (
ref,in, atauref readonly) saat meneruskan argumen ke parameter yang mengharapkan referensi. Menghilangkan pengubah dapat menyebabkan pengkompilasi membuat salinan sementara nilai, yang tidak efisien dan dapat menyebabkan perilaku yang tidak terduga jika kode panggilan mengharapkan modifikasi tercermin dalam variabel asli (CS9192, CS9193).
Untuk informasi selengkapnya tentang parameter referensi dan meneruskan variabel berdasarkan referensi, lihat Parameter metode, kata kunci ref, dan Spesifikasi Bahasa C#.
Variabel referensi yang dapat ditulis memerlukan objek yang dirujuk yang dapat ditulis
Variabel referensi yang dapat ditulis mengharuskan referensi juga dapat ditulis. Kesalahan berikut menunjukkan bahwa variabel tidak dapat ditulis:
-
CS0192: Field
readonlytidak dapat digunakan sebagai nilairefatauout(kecuali dalam konstruktor) -
CS0199: Bidang
static readonlytidak dapat digunakan sebagairefnilai atauout(kecuali dalam konstruktor statis) -
CS1605: Tidak dapat menggunakan variabel sebagai nilai
refatauoutkarena hanya baca -
CS1649: Anggota dari field
readonlytidak dapat digunakan sebagai nilairefatauout(kecuali dalam konstruktor) -
CS1651: Field dari sebuah field
static readonlytidak dapat digunakan sebagai nilairefatauout(kecuali dalam konstruktor statis) -
CS1655: Tidak dapat menggunakan bidang dengan tipe sebagai nilai
refatauout -
CS1657: Tidak dapat menggunakan variabel sebagai
refnilai atauout -
CS8329: Tidak dapat menggunakan variabel sebagai nilai
refatauoutkarena variabel tersebut adalah variabel hanya baca -
CS8330: Anggota dari variabel tidak dapat digunakan sebagai nilai
refatauoutkarena variabel tersebut bersifat hanya-baca -
CS8331: Tidak dapat menetapkan nilai ke variabel atau menggunakannya sebagai ruas kanan dari penetapan
refkarena merupakan variabel hanya baca -
CS8332: Tidak dapat menetapkan nilai ke anggota variabel atau menggunakannya sebagai ruas kanan dari operator
refpenugasan karena variabel tersebut bersifat hanya baca
Untuk memperbaiki kesalahan ini:
- Salin nilai dari bidang readonly ke variabel lokal dan teruskan variabel lokal sebagai
refparameter atauout. Bidang readonly tidak dapat diubah setelah inisialisasi (kecuali dalam konstruktor) dan memungkinkan referensi yang dapat ditulis untuk mereka akan melanggar jaminan immutabilitas yang disediakan readonly (CS0192, CS0199, CS1649, CS1651). - Gunakan
ref readonlyatauinparameter alih-alihrefatauoutsaat Anda perlu meneruskan variabel baca-saja, variabel iterasi, atau nilai lain yang tidak dapat ditulis berdasarkan referensi. Pengubah ini menunjukkan bahwa metode hanya akan membaca nilai yang dirujuk tanpa mencoba memodifikasinya. Itu selaras dengan batasan kekekalan variabel asli (CS1605, CS1655, CS1657, CS8329). - Salin anggota dari variabel readonly ke variabel lokal sebelum meneruskannya sebagai referensi yang dapat ditulis. Meskipun anggota itu sendiri mungkin tidak dinyatakan sebagai readonly, itu diakses melalui jalur readonly (melalui field readonly, parameter
in, atau lokalref readonly), dan kompilator memberlakukan transitivitas dari sifat readonly untuk mencegah mutasi tidak langsung data readonly (CS8330, CS8332). - Hindari penetapan ref yang dapat ditulis ke variabel baca-saja, variabel iterasi foreach, menggunakan sumber daya pernyataan, atau variabel pernyataan tetap. Variabel ini memiliki semantik seumur hidup khusus yang dikelola oleh kompilator. Variabel secara otomatis diselesaikan atau dibuang di akhir cakupannya. Referensi eksternal menciptakan referensi menggantung setelah pembuangan (CS8331).
Untuk informasi selengkapnya tentang semantik baca-saja dan parameter referensi, lihat kata kunci baca-saja, pengubah parameter in, ref readonly, dan Spesifikasi Bahasa C#.