2011-11-10 32 views
8

Olası Çoğalt:
Foreach can throw an InvalidCastException?Derleyici neden bu fişe izin veriyor?

aşağıdaki kod bloğunu

public class Base 
{ 
} 

public class DerivedLeft : Base 
{ 
} 

public class DerivedRight : Base 
{ 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Base> list = new List<Base> { new DerivedLeft(), new DerivedRight() }; 
     foreach (DerivedLeft dl in list) 
     { 
      Console.WriteLine(dl.ToString()); 
     } 
    } 
} 

Bildirim foreach döngüsü içinde DerivedLeft için Üssü'nden döküm düşünün. Bu, herhangi bir hata ya da uyarı olmaksızın iyi bir şekilde (Visual Studio 2010) derler. Açıkçası, ikinci döngü yinelemesinde bir InvalidCastException alacağız. Derleyicinin bu tür bir koda karşı tepkisi ile ilgili bir soru sorulursa, hiç şüphesiz bu derleyicinin fark edilmesine ve en az bir uyarı üretmesine izin vermeyeceğim. Ama görünüşe göre değil. Öyleyse, derleyici neden bu geçişten geçiyor?

cevap

2

liste türü List<Base> sahiptir ve foreach döngüsü değişken dl taban sınıf olarak Base sahiptir tipi DerivedLeft ait olduğu için. Bu nedenle, , çalışma zamanında çalışabilir, ancak , ürününe sahip değildir. Derleyici, listenizin başlatılmasını kontrol etmiyor. Bu bir hata yükseltmek için derleyici beklemek

+0

Ben derleyici örn .... başlatma kontrol etmez düşünüyorum. Eğer MyOtherClass'ı orada bir derleme zamanı istisnası varsa –

+0

@RoyiNamir: Evet, derleyici, başlatmanın doğru olup olmadığını kontrol eder, ancak foreach döngüsüne ulaştığında sadece eşleşen elemanların olup olmadığını kontrol etmez. – Fischermaen

+0

doğru ............ –

0

bu bir hata yükseltmek için bekliyor gibidir:

Base b = new DerivedRight(); 
DerivedLeft d = (DerivedLeft)b; 
+0

aslında derleyici bu konuda bir hata ortaya çıkaracaktır, çünkü değişken adını sağladığınız için DerivedLeft :) – Trogvar

+0

true ......... :) – nogola

+0

Dürüstlük içinde 'foreach' ile ilgili ima NET1.0 ya da 1.1 için C# ile kodlanmadığı sürece, bu kadar açık değil, ki jeneriklerin yokluğu, her bir foreach'ın yaptığı gibi, dolaylı bir oyuncuya sahip olmamak için çok daha garip olurdu. 'nesne ile uğraşmak' bir ihtiyacımız olurdu. –

İlgili konular