2014-02-10 261 views
0

我有以下代碼:C#鑄造

public class BaseClass {} 
public class Class1 : BaseClass {} 
public class Class2 : BaseClass {} 

public class BaseClassList : List<BaseClass> {} 
public class Class1List : List<Class1> {} 
public class Class2List : List<Class2> {} 

    public void Setup() 
    { 
     BaseClassList b = new BaseClassList(); 
     b.Add(new BaseClass()); 
     b.Add(new BaseClass()); 
     b.Add(new BaseClass()); 

     var list = from a in b 
        select a; 

     Class1List c1 = new Class1List(); 

     foreach (BaseClass a in b) 
     { 
      var o = a as Class1; 
      if (o != null) 
       c1.Add(o); 
     } 
    } 

然而,鑄造爲Class1的時候,鄰始終爲空。問題是什麼?

+0

您只向'b'添加'BaseClass'並且沒有'Class1'。每隻狗都是動物,但不是所有的動物都是狗。 –

+0

http://stackoverflow.com/questions/10172767/cast-base-instance-to-derived-class-downcast-in-c-sharp –

+2

由於不會將一個類轉換爲另一個類,因此只會在它指定它的情況下是該類型的一個實例 – Liath

回答

5

問題是a不是Class1對象。就這樣。 再次仔細閱讀您的代碼 - 您爲什麼會認爲一個BaseClass對象可以被轉移到一個類中,並從中派生出來?

3

becasue aBaseClass根據您的代碼:

... 
b.Add(new BaseClass()); 
b.Add(new BaseClass()); 
b.Add(new BaseClass()); 
... 

,你可以不投基地孩子類,你必須這樣做,反之亦然。

例子:

... 

    b.Add(new Class1()); 
    b.Add(new Class1()); 
    ... 

,並在此之後將是正確的:

foreach (var a in b) 
{ 
    var o = a as Class1;//CORRECT.  
} 
+3

所有Class1都是BaseClass,但並非所有BaseClass都是Class1 – Liath

0

因爲你鑄造你的基類的超類。 就像告訴編譯器一個「Person」永遠是「軟件開發者」,它應該是相反的方式。所以,「軟件開發者」永遠是「人」,「會計師」也是「人」。

因此, 「BaseClass」是「Person」; 「Class1」是「軟件開發人員」; 「Class2」是「會計」

因此,您應該將「Software Developer/Class1」或「Accountant/Class2」的實例添加到BaseClassList的「Person」列表中。

然後將你的BassClass標記爲抽象。