2014-01-27 32 views
2

爲什麼不能編譯?也許FW5可以啓用...泛型繼承...不起作用

static void Main(string[] args) 
    { 
     List<Foo> foos = new List<Goo>(); 
    } 

    public class Foo 
    { 

    } 

    public class Goo : Foo 
    { 

    } 

Stackover流說我的文章主要是代碼......但是,這可能會質疑,所以我想通過代碼文本比驗證....希望這是足夠

現在它說我沒有正確的描述問題..只是看了一遍,似乎被我很好...

回答

8

由於Goo列表是Foo列表。如果奏效,你可以做(​​在編譯時):

​​3210

這顯然不能工作,因爲列表只能採取Goo實例。

差異確實存在(取決於框架版本),但受限於:接口和委託(而不是具體類型,如列表)和b:知道所有 - 「in」或「已知所有」 「情景。

例如,下面將編譯最近的框架/編譯器版本:

IEnumerable<Goo> goos = new List<Goo>(); 
IEnumerable<Foo> foos = goos; 

在這種情況下,因爲每個Goo靜態稱爲是一個Foo它工作正常。從技術上講,這使用IEnumerable<out T>簽名的out部分。

+0

嗨馬克,感謝你的答案..使用「IEnumerable的全球海洋觀測系統時Basicly =新名單( );」非常適合不濫用ICollection功能。所以(T out)..而不是(T in):) –

5

不允許你這樣做的原因是,它會允許這樣的代碼:

public class Mammal {} 

public class Cat: Mammal {} 

public class Dog: Mammal {} 

... 

List<Cat> cats = new List<Cat>(); 

List<Mammal> mammals = cats; // Imagine this compiles. 

mammals.Add(new Dog()); // We just added a dog to the list of cats!