Let’s take a closer look at co- and contravariance on generic interface types. At the start of this chapter, you saw how the next piece of code didn’t compile in .NET 3.5, with the assumption that
MakeJuice takes in an
IEnumerable<Apple> apples = ...;var juice = MakeJuice(from apple in apples where apple.Color == Color.Red select apple);
The reason is that
IEnumerable<T> was invariant in its type parameter
T. Invariance simply means that no typing relationship between the types
IEnumerable<Derived> is established. They’re treated as unrelated to one another.
In .NET 4,
IEnumerable<T> has been marked ...