c# c#-4.0 covariance contravariance

c# - ¿Por qué la covarianza no funciona con el método genérico?



c#-4.0 covariance (1)

Supongamos que tengo interfaz y clase:

public interface ITree {} public class Tree : ITree {}

Como IEnumerable<T> es covariante , la siguiente línea de código se compila correctamente:

IEnumerable<ITree> trees = new List<Tree>();

Pero cuando lo pongo en método genérico:

public void Do<T>() where T : ITree { IEnumerable<ITree> trees = new List<T>(); }

Me compila el error del compilador:

Error 1 No se puede convertir implícitamente el tipo ''System.Collections.Generic.List'' a ''System.Collections.Generic.IEnumerable''. Existe una conversión explícita (¿falta una conversión?) D: / lab / Lab.General / Lab.General / Program.cs 83 40 Lab.General

¿Por qué la covarianza no funciona en este caso?


Esto se debe a que la varianza solo funciona con tipos de referencia (clases, interfaces y delegados). Agrega una restricción de clase y compila simplemente bien:

public static void Do<T>() where T : class, ITree