В приведенном ниже примере я могу добавить List
типа Animal
. С Dog
и Cat
происходят от животных, 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 { }
Попробуйте 'статической силы Test (IEnumerable животных)' –
поиска для 'ковариации и контрвариации в C#' –
Как следует Selman22, посмотрите [здесь] (https://msdn.microsoft.com/it-it/ библиотека/dd799517 (v = vs.110) .aspx) –