我在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<IElement>
:
IProvider<IElement> provider = new MyProvider();
尽管
MyProvider
是一个IProvider<MyElement>
,而MyElement
是一个IElement
,但我仍然需要将其强制转换为IProvider<IElement>
。我可以通过让MyProvider
也实现IProvider<MyElement>
来避免强制转换,但为什么它不能解决类型参数中的层次结构呢?编辑:根据Thomas的建议,我们可以使其在
T
上协变。但如果存在其他像下面这样的具有T
类型参数的方法怎么办?public interface IProvider<T> where T : IElement {
IEnumerable<T> Provide();
void Add(T t);
}