У меня проблема с дженериками в 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);
}