Kesalahan dan peringatan yang terkait dengan parameter referensi, variabel, dan pengembalian

Kesalahan berikut dapat dihasilkan saat Anda bekerja dengan variabel referensi:

  • CS0192: Bidang readonly tidak dapat digunakan sebagai ref nilai atau out (kecuali dalam konstruktor)
  • CS0199: Bidang static readonly tidak dapat digunakan sebagai ref nilai atau out (kecuali dalam konstruktor statis)
  • CS0206: Properti atau pengindeks yang tidak dikembalikan ref mungkin tidak digunakan sebagai nilai out atau ref
  • CS0631: ref dan out tidak valid dalam konteks ini
  • CS0767: Tidak dapat mewarisi antarmuka dengan parameter jenis yang ditentukan karena menyebabkan metode berisi kelebihan beban yang hanya berbeda pada ref dan out
  • CS1510: A ref atau out nilai harus berupa variabel yang dapat ditetapkan
  • CS1605: Tidak dapat menggunakan variabel sebagai ref nilai atau out karena bersifat baca-saja
  • CS1623: Iterator tidak dapat memiliki refparameter , in atau out
  • CS1649: Anggota field readonly tidak dapat digunakan sebagai nilai ref atau out (kecuali dalam konstruktor)
  • CS1651: Bidang dari field hanya-baca statis tidak dapat digunakan sebagai nilai ref atau out (kecuali dalam konstruktor statis)
  • CS1655: Tidak dapat menggunakan field dengan tipe sebagai nilai ref atau out
  • CS1657: Tidak dapat menggunakan variabel sebagai ref nilai atau out
  • CS1741: A ref atau out parameter tidak dapat memiliki nilai default
  • CS1939: Tidak dapat meneruskan variabel rentang sebagai out parameter atau ref
  • CS1988: Metode asinkron tidak dapat memiliki refparameter , in atau out
  • CS7084: Kejadian Windows Runtime tidak dapat diteruskan sebagai parameter out atau ref.
  • 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 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
  • CS8329: Tidak dapat menggunakan variabel sebagai nilai ref atau out karena variabel tersebut bersifat hanya baca
  • CS8330: Anggota dari variabel tidak dapat digunakan sebagai ref atau nilai out karena merupakan variabel hanya-baca
  • CS8331: Tidak dapat menetapkan nilai ke variabel atau menggunakannya sebagai ruas kanan penetapan ref karena variabel tersebut bersifat baca-saja
  • CS8332: Tidak dapat menetapkan nilai ke anggota variabel atau menggunakannya sebagai ruas kanan dari penugasan ref karena 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 ref harus berupa variabel ref.
  • CS8388: Variabel out tidak 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 using tidak dapat digunakan dalam metode async atau ekspresi lambda async.
  • CS9190: readonly pengubah harus ditentukan setelah ref.
  • CS9199: Parameter ref readonly tidak 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 ref untuk argumen yang sesuai dengan in parameter setara dengan in. Pertimbangkan untuk menggunakan in sebagai gantinya.
  • CS9192: Argumen harus diteruskan dengan ref atau in kata kunci.
  • CS9193: Argumen harus menjadi variabel karena diteruskan ke ref readonly parameter
  • CS9195: Argumen harus diteruskan dengan in kata 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 readonly parameter, tetapi ref readonly harus digunakan hanya untuk referensi. Pertimbangkan untuk mendeklarasikan parameter sebagai in.
  • 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:

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 ref kiri dari penugasan harus berupa variabel ref.
  • CS8388: Variabel out tidak dapat dinyatakan sebagai lokal ref.
  • CS9190: readonly pengubah harus ditentukan setelah ref.

Untuk memperbaiki kesalahan ini:

  • Pastikan bahwa operand kiri dari operator = ref adalah 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 readonly bukan readonly ref. Spesifikasi bahasa C# memerlukan ref kata kunci untuk mendahului readonly pengubah dalam deklarasi parameter untuk mempertahankan sintaks yang konsisten di semua jenis parameter referensi (CS9190).
  • ref Gunakan kata kunci alih-alih out saat mendeklarasikan variabel referensi lokal. out secara eksklusif adalah pengubah parameter yang menunjukkan metode harus menetapkan nilai sebelum mengembalikan, sedangkan ref adalah 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: ref dan out tidak valid dalam konteks ini
  • CS0767: Tidak dapat mewarisi antarmuka dengan parameter tipe yang ditentukan karena menyebabkan metode memiliki overload yang hanya berbeda dalam ref dan out
  • CS1623: Iterator tidak dapat memiliki refparameter , in atau out
  • CS1741: A ref atau out parameter tidak dapat memiliki nilai default
  • CS1939: Tidak dapat meneruskan variabel rentang sebagai out parameter atau ref
  • CS1988: Metode asinkron tidak dapat memiliki refparameter , in atau out
  • CS7084: Kejadian Windows Runtime tidak dapat diteruskan sebagai parameter out atau ref.
  • CS8196: Referensi ke variabel yang ditik out implisit 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 using tidak dapat digunakan dalam metode async atau ekspresi lambda async.
  • CS9199: Parameter ref readonly tidak 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 readonly parameter, tetapi ref readonly harus digunakan hanya untuk referensi. Pertimbangkan untuk mendeklarasikan parameter sebagai in.
  • 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 ref parameter dan out . 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 out variabel 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 ref dan out. Spesifikasi bahasa C# memperlakukan ini sebagai tanda tangan yang berbeda tetapi tidak memberikan cara untuk membedakan implementasi mana yang harus dipanggil karena keduanya ref dan out berbagi 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 ref pada 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 menambahkan ref akan membuat referensi ke referensi, sementara ekstensi jenis nilai dengan ref memungkinkan 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 dengan ref readonly jaminan bahwa parameter referensikan data yang ada yang tidak boleh diubah (CS9199).
  • Pastikan semua ref bidang 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 in bukan ref readonly saat memberikan nilai default. ref readonly dirancang untuk skenario di mana pemanggil meneruskan referensi ke variabel yang ada, sedangkan in parameter 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 unscoped atau 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 unscoped dari 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 out atau ref
  • CS1510: A ref atau out nilai harus berupa variabel yang dapat ditetapkan

Peringatan:

  • CS9191: Pengubah ref untuk argumen yang sesuai dengan in parameter setara dengan in. Pertimbangkan untuk menggunakan in sebagai gantinya.
  • CS9192: Argumen harus diteruskan dengan ref atau in kata kunci.
  • CS9193: Argumen harus menjadi variabel karena diteruskan ke ref readonly parameter
  • CS9195: Argumen harus diteruskan dengan in kata 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 in alih-alih ref saat meneruskan argumen ke in parameter. Meskipun ref secara teknis berfungsi karena kompatibilitas mundur, pengubah in lebih 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, atau ref 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 readonly tidak dapat digunakan sebagai nilai ref atau out (kecuali dalam konstruktor)
  • CS0199: Bidang static readonly tidak dapat digunakan sebagai ref nilai atau out (kecuali dalam konstruktor statis)
  • CS1605: Tidak dapat menggunakan variabel sebagai nilai ref atau out karena hanya baca
  • CS1649: Anggota dari field readonly tidak dapat digunakan sebagai nilai ref atau out (kecuali dalam konstruktor)
  • CS1651: Field dari sebuah field static readonly tidak dapat digunakan sebagai nilai ref atau out (kecuali dalam konstruktor statis)
  • CS1655: Tidak dapat menggunakan bidang dengan tipe sebagai nilai ref atau out
  • CS1657: Tidak dapat menggunakan variabel sebagai ref nilai atau out
  • CS8329: Tidak dapat menggunakan variabel sebagai nilai ref atau out karena variabel tersebut adalah variabel hanya baca
  • CS8330: Anggota dari variabel tidak dapat digunakan sebagai nilai ref atau out karena variabel tersebut bersifat hanya-baca
  • CS8331: Tidak dapat menetapkan nilai ke variabel atau menggunakannya sebagai ruas kanan dari penetapan ref karena merupakan variabel hanya baca
  • CS8332: Tidak dapat menetapkan nilai ke anggota variabel atau menggunakannya sebagai ruas kanan dari operator ref penugasan karena variabel tersebut bersifat hanya baca

Untuk memperbaiki kesalahan ini:

  • Salin nilai dari bidang readonly ke variabel lokal dan teruskan variabel lokal sebagai ref parameter atau out . 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 readonly atau in parameter alih-alih ref atau out saat 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 lokal ref 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#.