SORU
30 Temmuz 2009, PERŞEMBE


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
30 Temmuz 2009, PERŞEMBE


=============

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.

< / ^ hr .

M tür Animal 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.)

< / ^ hr .

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

< / ^ hr .

Şimdi düşünün N(out Mammal n).

N türünde bir değişken Giraffe uzatır mısın?

Hayır. N ** 34 N Tiger bir yaz istersen yazma.

Sonuç 3: out parametreleri yapılamaz "". küçük

< / ^ hr .

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 olarak x Pass.
  • N x için bir takma ad olan n içine Tiger 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

< / ^ hr .

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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • amc

    amc

    21 EYLÜL 2005
  • Break

    Break

    10 Aralık 2005
  • George McCarron

    George McCar

    29 Mayıs 2013