Q:

Why covariance does not work with generic method

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?

A:

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

