public interface List<T> {
void Add(T item);
T this[int index] { get; set; }
...
}
public interface List<Apple> {
void Add(Apple item);
Apple this[int index] { get; set; }
...
}
var bagOfApples = new List<Apple>();
var bagOfFruit = (List<Fruit>)bagOfApples;
bagOfFruit.Add(new Watermelon());
Apple apple = bagOfApples[0];
var bagOfApples = new List<Apple>();
var bagOfFruit = (List<Fruit>)bagOfApples;
bagOfFruit.Add(new Watermelon());
Apple apple = bagOfApples[0];
var bagOfFruit = new List<Fruit>();
bagOfFruit.Add(new Watermelon());
var bagOfApples = (List<Apple>)bagOfFruit;
Apple apple = bagOfApples[0];
var appleTree = new Tree<Apple>();
var fruitTree = (Tree<Fruit>)appleTree;
Fruit fruit = fruitTree.Pick();
var pearTree = (Tree<Pear>)fruitTree;
Pear pear = pearTree.Pick();
Func<List<Fruit>, Juice> blender = bagOfFruit => ...
Func<List<Apple>, Pie> recipe = bagOfApples => ...
var appleBlender = (Func<List<Apple>, Juice>)blender;
var fruitPieRecipe = (Func<List<Fruit>, Pie>)recipe;
var fruitRecipe = (Func<List<Fruit>, Drink)blender;
var appleRecipe = (Func<List<Apple>, Food>)recipe;
IEnumerable<out T>
Func<in T, out TResult>
Iterable[+T]
Function1[-T1, +R]
covariant
out
+
contravariant
in
-
covariant
out
plus
contravariant
in
minus