2015-02-24 47 views
0

在下面的示例中,我可以添加類型的List。由於DogCat來自動物,所以List可以容納每個。但是,如果我有一種方法接受List<Animal>,則無法傳入參考List<Dog>。如果Dog源自動物,爲什麼這是無效的?但是,如果我有一個方法,除了Object類型的參數,並且所有對象來自Object,它的工作原理。除派生類的對象之外的方法

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Animal> animals = new List<Animal>(); 
     animals.Add(new Dog() { Color = "Black" }); // allowed since Dog derives from Animal 

     List<Dog> dogs = new List<Dog>(); 
     dogs.Add(new Dog() { Color = "White" }); 

     Test(animals); 
     Test(dogs); // not allowed - does not compile 
     Test2(dogs); // valid as all objects derive from object 
    } 

    static void Test(List<Animal> animals) { 
     // do something 
    } 

    static void Test2(object obj) { 

    } 
} 

public class Animal { 

    public String Color { get; set; } 

} 

public class Dog : Animal { } 
public class Cat : Animal { } 
+1

嘗試'靜態無效測試(IEnumerable 動物)' – 2015-02-24 15:14:08

+2

搜索'協變量和c#中的變異性' – 2015-02-24 15:15:51

+0

正如Selman22建議,看看[這裏](https://msdn.microsoft.com/it-it/ library/dd799517(v = vs.110).aspx) – 2015-02-24 15:16:34

回答

2

想象一下,Test(dogs)確實編譯。然後想象Test()實現類似如下:

static void Test(List<Animal> animals) 
{ 
    animals.Add(new Cat()); // Where Cat is derived from Animal 
} 

你只是增加了一個貓犬的列表...顯然不能被允許的。這就是爲什麼它不是。

但是,如果你只訪問列表中的元素,而不是添加到列表中,你可以聲明Test()像這樣:

static void Test(IEnumerable<Animal> animals) 
{ 
    foreach (var animal in animals) 
    { 
     // Do something with animal. 
    } 
} 

然後,你可以通過它實現IEnumerable<T>任何集合類型,如List<T>和普通數組。

+0

現在很有意義。 – PhillyNJ 2015-02-24 15:24:15

+0

好吧,給狗加貓通常是很搞笑的,所以我會允許它......; – Gerino 2015-02-24 15:24:27

+0

狗和貓...在同樣的'列表'...... [Mass Hysteria !!!](https: //www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0CCUQtwIwAQ&url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D9S4cldkdCjE&ei=vZfsVI6mL- bHsQSBuYDgCw&usg = AFQjCNGzPe3S7AsY6QTfnKAu-096C6WMcQ&sig2 = 9ik5utUb2D5HjV​​V7AOZ8jw&bvm = bv.86475890,d.cGU) – 2015-02-24 15:25:20

2

請致電Test(dogs.Cast<Animal>().ToList())。將參數類型更改爲IEnumerable以跳過創建副本的ToList()

intobjectList<Animal>object,正如List<Dog>。但List<Dog>不是List<Animal>