[英]Why can't I use covariance with two generic type parameters?
请考虑以下示例:
class Base {}
class Derived : Base {}
class Test1
{
private List<Derived> m_X;
public IEnumerable<Base> GetEnumerable()
{
return m_X;
}
}
编译得很好,因为IEnumerable<T>
在T
是协变的。
但是,如果我做同样的事情,但现在使用泛型:
class Test2<TBase, TDerived> where TDerived : TBase
{
private List<TDerived> m_X;
public IEnumerable<TBase> GetEnumerable()
{
return m_X;
}
}
我得到编译器错误
无法将表达式类型'System.Collection.Generic.List'转换为返回类型'System.Collection.Generic.IEnumerable'
我在这做错了什么?
事实上,在第一种情况下, Base
已知是一个类。 在第二种情况下,类型参数T
可以是类或结构(这是编译器的思考方式)。
通过指定T
是一个类来解决这个问题,错误将消失:
class Test2<TBase, TDerived> where TDerived : class, TBase
{
private List<TDerived> m_X;
public IEnumerable<TBase> GetEnumerable()
{
return m_X;
}
}
因此,编译器试图告诉我们TDerived可能是一个结构(因为你没有指定class
约束),而且正如我们 已经知道的那样 , 协方差和逆变不适用于结构 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.