2015-07-05 4 views
1

Я не могу понять, почему я не могу перебирать список по классу, который я связал.Итерация через список <interface> Элементы

например.

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

Вы действительно не объяснили, что не так с этим кодом. – Enigmativity

+0

Возможно, я немного почитаю ваш вопрос, но если вы пытаетесь * только * ударить объекты Dog в цикле, а затем отфильтровать его. 'foreach (Собака obj в AnimalList.OfType ())' –

ответ

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); 
} 

Теперь это приводит только к выводу названия собаки.

2

Каждый DogявляетсяIAnimal, но не каждый IAnimalявляетсяDog. Особенно не Chicken: это определенно не Dog. Именно поэтому этот цикл будет работать в качестве исключения, когда он достигает Chicken:

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

Однако, если вы делаете это как этот

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

или эквивалентный

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

в код собирается скомпилировать и запустить правильно.

Смежные вопросы