【发布时间】:2023-04-03 14:52:01
【问题描述】:
我对 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);
}
【问题讨论】:
标签: c# generics types parameters hierarchy