Neden yok't 'ref' ve '' destek polimorfizmi?
Aşağıdaki al:
class A {}
class B : A {}
class C
{
C()
{
var b = new B();
Foo(b);
Foo2(ref b); // <= compile-time error:
// "The 'ref' argument doesn't match the parameter type"
}
void Foo(A a) {}
void Foo2(ref A a) {}
}
Neden yukarıda derleme zamanı hatası oluşur mu? Bu ikisi de ref
ve 3 ** bağımsız değişken olur.
CEVAP
=============
GÜNCELLEME: bu blog yazısı için: temel olarak bu cevabı kullandım
Why do ref and out parameters not allow type variation?
Bu konuda daha fazla yorum için blog sayfasına bakın. Harika soru için teşekkür ederim.
=============
Hadi sana ders var**, Mammal
, , *, *Reptile
*7 4 8* ve belli sınıflara ilişkileri ile Tiger
, sanırım.
Şimdi 10* *bir yöntem olduğunu varsayalım. M
hem okuma hem de m
yazabilirsiniz.
M
türAnimal
bir değişken uzatır mısın?
Hayır. Değişken ** 15 ama M
sadece Memeliler içerir üstlenecek bir içerebilir. Turtle
Mammal
değildir.
Sonuç 1: ref
parametreleri yapılamaz "". daha büyük (Memeliler daha fazla hayvan var, bu yüzden değişkeni almak "daha büyük olabilir, çünkü" daha fazla şeyler içerir.)
M
20* *türünde bir değişken uzatır mısın?
Hayır. M
** 23 M
m
Tiger
bir yaz istersen yazma. Şimdi aslında 28* *türünde bir değişken Tiger
koyduk.
Sonuç 2: ref
parametreleri yapılamaz "". küçük
Şimdi düşünün N(out Mammal n)
.
N
türünde bir değişkenGiraffe
uzatır mısın?
Hayır. N
** 34 N
Tiger
bir yaz istersen yazma.
Sonuç 3: out
parametreleri yapılamaz "". küçük
N
38* *türünde bir değişken uzatır mısın?
Hmm.
Evet, neden olmasın? n
N
okunamıyor sadece bunun için değil mi yazabilir? Animal
ve her şeyi türünde bir değişken için Tiger
bir yaz, değil mi?
Yanlış. Kural değildir "N
n
yazabilir".
Bu kurallar kısaca şunlardır:
1) N
N
normalde dönmeden önce n
yazmak için. Eğer N
atar, tüm bahisler kapalı.)
2) N
n
bir şeyler okur önce n
bir şey yazmak zorunda değil.
Olayların bu sıra, izin verir:
- 54 ** tür
x
bir alan bildirin. - 57* *
out
bir parametre olarakx
Pass. N
x
için bir takma ad olann
içineTiger
bir yazar.- Başka bir iş parçacığı üzerinde, biri
x
Turtle
bir yazar. N
n
, içeriğini okumaya çalışır ve türüMammal
bir değişken olduğunu düşündüğüTurtle
bir keşfeder.
Açıkça yasadışı hale getirmek istiyoruz.
Sonuç 4: out
parametreleri yapılamaz "". büyük
Nihai sonuç:Ne de out
parametreler ref
çeşitleri farklı olabilir. Aksi takdirde yapılacak doğrulanabilir tür güvenliği kırmak için.
Temel tip teoride bu konular sizi ilgilendirmiyor ise, my series on how covariance and contravariance work in C# 4.0 okuma düşünün.
Neden Rails4 destek "varlık"...
Neden't Dize deyimi destek boş bi...
Neden tüm tarayıcılar tüm CSS dosyalar...
Neden sıralanmamış bir dizi daha hızlı...
Neden bu iki kez (1927) garip bir sonu...