繁体   English   中英

为什么我不能使用两个泛型类型参数的协方差?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM