Дженерики с ограничениями с иерархией в параметре типа

У меня проблема с дженериками в C #. Надеюсь, вы мне поможете.

public interface IElement { }

public interface IProvider<T> where T : IElement {
    IEnumerable<T> Provide();
}

Пока все довольно просто. Я хочу, чтобы поставщики возвращали перечисления определенных элементов. Конкретная реализация интерфейсов выглядит следующим образом:

public class MyElement : IElement { }

public class MyProvider : IProvider<MyElement> {
    public IEnumerable<MyElement> Provide() {
        [...]
    }
}

Но проблема возникает сейчас, когда я хочу ее использовать. Это не компилируется, потому что не может неявно преобразовать MyProvider в IProvider :

IProvider<IElement> provider = new MyProvider();

Мне нужно выполнить приведение к IProvider , несмотря на MyProvider - это IProvider , а MyElement - это IElement . Я мог бы избежать приведения, заставив MyProvider также реализовать IProvider , но почему он не разрешает иерархию в параметре типа?

РЕДАКТИРОВАТЬ: Согласно предложению Томаса, мы можем сделать его ковариантным в T . Но что, если есть другие методы, как показано ниже, где есть аргументы типа T ?

public interface IProvider<T> where T : IElement {
    IEnumerable<T> Provide();
    void Add(T t);
}
6
задан Roman C 16 March 2016 в 21:07
поделиться