=============
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
, Turtle
ve Tiger
, bariz sınıflara ilişkilerle.
Şimdi bir yönteminiz olduğunu varsayalım void M(ref Mammal m)
. M
hem okuyabilir hem de yazabilir m
.
Bir değişken türüne geçebilir Animal
misiniz M
?
Hayır. Bu değişken a içerebilir Turtle
, ancak M
sadece Memelileri içerdiğini varsayacaktır. A Turtle
, a değildir Mammal
.
Sonuç 1 : ref
parametreler "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 Giraffe
misiniz M
?
Hayır M
, yazabilir m
ve içine M
yazmak isteyebilir . Şimdi , aslında bir tür olan bir değişkeneTiger
m
Tiger
Giraffe
.
Sonuç 2 : ref
parametreler "daha küçük" yapılamaz.
Şimdi düşünün N(out Mammal n)
.
Bir değişken türüne geçebilir Giraffe
misiniz N
?
Hayır. A N
yazabilir n
ve N
yazmak isteyebilir Tiger
.
Sonuç 3 : out
parametreler "daha küçük" yapılamaz.
Eğer türünde bir değişken geçirebilirsiniz Animal
için N
?
Hmm.
Peki neden olmasın? N
okuyamıyor n
, sadece yazabiliyor, değil mi? Tiger
Bir değişken türüne bir yazarsınız Animal
ve hazırsınız, değil mi?
Yanlış. Kural " N
sadece yazabilir n
" değildir.
Kurallar kısaca:
1) normal N
şekilde n
dönmeden önce N
yazmalıdır. (EğerN
Atarsa, tüm bahisler kapalıdır.)
2) bir N
şey n
okumadan önce bir şeyler yazmalın
.
Bu, şu olaylar dizisine izin verir:
- Bir alanı bildirmek
x
ÇeşidiAnimal
.
- Parametresine
x
bir out
parametre olarak iletin N
.
N
bir takma ad olan Tiger
içine yazarn
x
.
- Başka bir iş parçacığında, biri
Turtle
içine yazar x
.
N
a'nın içeriğini okumaya çalışır n
ve bir Turtle
tür değişkeni olduğunu düşündüğü şeyde bir keşfeder Mammal
.
Açıkça bunu yasadışı yapmak istiyoruz.
Sonuç 4 : out
parametreler "daha büyük" yapılamaz.
Nihai sonuç : Ne ref
ne de out
parametreler 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 .