using System.Collections.Generic;
public interface ICovariant<out T> {}
public interface IContravariant<in T> {}
public class Covariant<T> : ICovariant<T> { }
public class Contravariant<T> : IContravariant<T> { }
public class Dog : Animal { }
public class Cat : Animal { }
public delegate Animal AnimalDelegate();
public delegate Animal AnotherAnimalDelegate(Dog d);
public static Cat CatMethod() { return null; }
public static Animal DogMethod(Animal a) { return null; }
public static void Main()
var cats = new List<Cat>();
var moreAnimals = new List<Animal>();
var moreCats = moreAnimals;
AnimalDelegate ad = CatMethod;
AnotherAnimalDelegate aad = DogMethod;
ICovariant<Animal> animalOne = new Covariant<Animal>();
ICovariant<Dog> dog = new Covariant<Dog>();
IContravariant<Animal> animalTwo = new Contravariant<Animal>();
IContravariant<Cat> cat = new Contravariant<Cat>();