Assume I have interface and class:
public interface ITree {}
public class Tree : ITree {}
As IEnumerable<T>
is covariant, the code line below is compiled successfully:
IEnumerable<ITree> trees = new List<Tree>();
But when I put it into generic method:
public void Do<T>() where T : ITree
{
IEnumerable<ITree> trees = new List<T>();
}
I get compiled error from compiler:
Error 1 Cannot implicitly convert type 'System.Collections.Generic.List' to 'System.Collections.Generic.IEnumerable'. An explicit conversion exists (are you missing a cast?) D:\lab\Lab.General\Lab.General\Program.cs 83 40 Lab.General
Why covariance does not work in this case?
That is because variance only works with reference types (classes, interfaces & delegates). Add a class constraint and it compiles just fine:
public static void Do<T>() where T : class, ITree