我无法弄清楚为什么我不能通过我所接口的类迭代列表。
例如
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);
}
}
}
我做错了什么,是否有更好的角度来处理这种情况。
答案 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);
}
现在它只会输出狗名。