=============
GÜNCELLEME: Bu yanıtı bu blog girişinin temeli olarak kullandım:
Ref ve out parametreleri neden tür değişikliğine izin vermez?
Bu konu hakkında daha fazla yorum için blog sayfasına bakın. Bu mükemmel soru için teşekkürler.
=============
Diyelim ki sınıfları varsayalım Animal, Mammal, Reptile, Giraffe, Turtleve Tiger, bariz sınıflara ilişkilerle.
Şimdi bir yönteminiz olduğunu varsayalım void M(ref Mammal m). Mhem okuyabilir hem de yazabilir m.
Bir değişken türüne geçebilir Animalmisiniz M?
Hayır. Bu değişken a içerebilir Turtle, ancak Msadece Memelileri içerdiğini varsayacaktır. A Turtle, a değildir Mammal.
Sonuç 1 : refparametreler "daha büyük" yapılamaz. (Memelilerden daha fazla hayvan var, bu nedenle değişken daha fazla şey içerebileceği için "büyüyor".)
Bir değişken türüne geçebilir Giraffemisiniz M?
Hayır M, yazabilir mve içine Myazmak isteyebilir . Şimdi , aslında bir tür olan bir değişkeneTigermTigerGiraffe .
Sonuç 2 : refparametreler "daha küçük" yapılamaz.
Şimdi düşünün N(out Mammal n).
Bir değişken türüne geçebilir Giraffemisiniz N?
Hayır. A Nyazabilir nve Nyazmak isteyebilir Tiger.
Sonuç 3 : outparametreler "daha küçük" yapılamaz.
Eğer türünde bir değişken geçirebilirsiniz Animaliçin N?
Hmm.
Peki neden olmasın? Nokuyamıyor n, sadece yazabiliyor, değil mi? TigerBir değişken türüne bir yazarsınız Animalve hazırsınız, değil mi?
Yanlış. Kural " Nsadece yazabilir n" değildir.
Kurallar kısaca:
1) normal Nşekilde ndönmeden önce Nyazmalıdır. (EğerN Atarsa, tüm bahisler kapalıdır.)
2) bir Nşey nokumadan önce bir şeyler yazmalın .
Bu, şu olaylar dizisine izin verir:
- Bir alanı bildirmek
xÇeşidiAnimal .
- Parametresine
xbir outparametre olarak iletin N.
Nbir takma ad olan Tigeriçine yazarnx .
- Başka bir iş parçacığında, biri
Turtleiçine yazar x.
Na'nın içeriğini okumaya çalışır nve bir Turtletür değişkeni olduğunu düşündüğü şeyde bir keşfeder Mammal.
Açıkça bunu yasadışı yapmak istiyoruz.
Sonuç 4 : outparametreler "daha büyük" yapılamaz.
Nihai sonuç : Ne refne de outparametreler türlerini değiştirebilir. Bunun aksini yapmak, doğrulanabilir tip güvenliğini kırmaktır.
Temel tip teorisindeki bu konular ilginizi çekiyorsa, kovaryans ve kontraveransın C # 4.0'da nasıl çalıştığına dair serimi okumayı düşünün .