Search code examples
c#.netc#-4.0covariancecontravariance

Does C# 4's covariance support nesting of generics?


I don't understand why 'x' below converts, but 'y' and 'z' do not.

var list = new List<List<int>>();

IEnumerable<List<int>> x = list;
List<IEnumerable<int>> y = list;
IEnumerable<IEnumerable<int>> z = list;

Does the new covariance feature simply not work on generics of generics or am I doing something wrong? (I'd like to avoid using .Cast<> to make y and z work.)


Solution

  • "z" is fine in C# 4.0, IEnumerable<T> is covariant. List<T> is however not, you cannot make "y" work.

    Intuitively, if it were then this would be valid:

    List<IEnumerable<int>> y = list
    y.Add(new Stack<int>());
    

    Which breaks the promise that "list" can only contain List<int> elements.