=============
UPDATE: Saya menggunakan jawaban ini sebagai dasar untuk entri blog ini:
Mengapa parameter ref dan out tidak mengizinkan variasi jenis?
Lihat halaman blog untuk komentar lebih lanjut tentang masalah ini. Terima kasih atas pertanyaan bagusnya.
=============
Mari kita misalkan Anda memiliki kelas Animal, Mammal, Reptile, Giraffe, Turtledan Tiger, dengan hubungan subclassing jelas.
Sekarang misalkan Anda memiliki metode void M(ref Mammal m). Mbisa membaca dan menulis m.
Bisakah Anda mengirimkan variabel tipe Animalke M?
Tidak. Variabel tersebut dapat berisi a Turtle, tetapi Makan menganggap bahwa variabel tersebut hanya berisi Mamalia. A Turtlebukan Mammal.
Kesimpulan 1 : refParameter tidak bisa dibuat "lebih besar". (Ada lebih banyak hewan daripada mamalia, jadi variabelnya menjadi "lebih besar" karena bisa berisi lebih banyak hal.)
Bisakah Anda mengirimkan variabel tipe Giraffeke M?
Tidak. MBisa menulis ke m, dan Mmungkin ingin menulis Tigerke m. Sekarang Anda telah memasukkan a Tigerke dalam variabel yang sebenarnya bertipe Giraffe.
Kesimpulan 2 : refParameter tidak bisa dibuat "lebih kecil".
Sekarang pertimbangkan N(out Mammal n).
Bisakah Anda mengirimkan variabel tipe Giraffeke N?
Tidak. NDapat menulis ke n, dan Nmungkin ingin menulis Tiger.
Kesimpulan 3 : outParameter tidak bisa dibuat "lebih kecil".
Bisakah Anda mengirimkan variabel tipe Animalke N?
Hmm.
Nah, kenapa tidak? Ntidak bisa membaca n, hanya bisa menulis padanya, bukan? Anda menulis Tigerke variabel tipe Animaldan Anda sudah siap, bukan?
Salah. Aturannya bukanlah " Nhanya dapat menulis ke n".
Aturannya adalah, secara singkat:
1) Nharus menulis nsebelum Nkembali normal. (Jika Nmelempar, semua taruhan dibatalkan.)
2) Nharus menulis sesuatu nsebelum membaca sesuatu dari n.
Itu memungkinkan urutan kejadian ini:
- Deklarasikan bidang
xtipe Animal.
- Teruskan
xsebagai outparameter ke N.
Nmenulis Tigerke n, yang merupakan alias untuk x.
- Di utas lain, seseorang menulis
Turtleke x.
Nmencoba membaca isi dari n, dan menemukan a Turtledalam apa yang dianggapnya sebagai variabel tipe Mammal.
Jelas kami ingin membuatnya ilegal.
Kesimpulan 4 : outParameter tidak bisa dibuat "lebih besar".
Kesimpulan akhir : Baik parameter refmaupun outparameter tidak dapat mengubah jenisnya. Melakukan sebaliknya adalah merusak jenis keamanan yang dapat diverifikasi.
Jika masalah-masalah dalam teori tipe dasar ini menarik minat Anda, pertimbangkan untuk membaca seri saya tentang bagaimana kovarians dan kontravarian bekerja di C # 4.0 .