迭代List <interface> Items

时间:2015-07-05 01:02:57

标签: c# list interface iteration

我无法弄清楚为什么我不能通过我所接口的类迭代列表。

例如

public interface IAnimal
{
   string Name { get; set; }
}

public class Chicken:IAnimal
{
   public string Name { get; set; }
}

public class Dog:IAnimal
{
   public string Name { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var AnimalList = new List<IAnimal>();

        var Chicken1= new Chicken() { Name = "Chicken" }; 
        var Dog1= new Dog() { Name = "Dog" };

        AnimalList.Add(Dog1);
        AnimalList.Add(Chicken1);

        foreach (Dog obj in AnimalList)
        {
           Console.WriteLine(obj.Name); 
        }
    }
}

我做错了什么,是否有更好的角度来处理这种情况。

2 个答案:

答案 0 :(得分:2)

每个Dog 都是 IAnimal,但不是每个IAnimal 都是 Dog。尤其不是Chicken:它绝对不是Dog。这就是为什么这个循环在到达Chicken时会遇到异常的原因:

foreach (Dog obj in AnimalList) {
    ...
}

但是,如果你这样做

foreach (IAnimal obj in AnimalList) {
    ...
}

或同等的

foreach (var obj in AnimalList) {
    ...
}

代码将编译并正确运行。

答案 1 :(得分:2)

您已定义列表,使其包含IAnimal

元素
var AnimalList = new List<IAnimal>();

然后在循环中,您将元素指定为Dog。现在虽然Dog确实实现了IAnimal,但它并不是唯一可以实现的类型。因此,如果列表包含Dog以外的类型,则循环失败。

所以你有两种方法来解决这个问题。

一个是你改变你的循环:

foreach (IAnimal obj in AnimalList)
{
    Console.WriteLine(obj.Name); 
}

如果你这样做,你的代码就可以正常工作并输出狗和鸡的名字。

但是,如果您只想返回Dog个实例,则可以过滤列表。你这样做是这样的:

foreach (Dog obj in AnimalList.OfType<Dog>())
{
    Console.WriteLine(obj.Name); 
}

现在它只会输出狗名。