Подтвердить что ты не робот

Почему ковариация не работает с общим методом

Предположим, у меня есть интерфейс и класс:

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

Поскольку IEnumerable<T> является ковариантным, строка кода ниже компилируется успешно:

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

Но когда я помещаю его в общий метод:

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

Я получаю скомпилированную ошибку из компилятора:

Ошибка 1 Невозможно неявно преобразовать тип 'System.Collections.Generic.List' в 'System.Collections.Generic.IEnumerable'. Явное преобразование существует (вы пропускаете листинг?) D:\lab\Lab.General\Lab.General\Program.cs 83 40 Lab.General

Почему ковариация в этом случае не работает?

4b9b3361

Ответ 1

Это потому, что дисперсия работает только со ссылочными типами (классы, интерфейсы и делегаты). Добавьте ограничение класса и он просто компилируется:

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