协方差和泛型类型

时间:2016-05-02 16:54:44

标签: c# .net compiler-errors

为什么以下代码会为通用案例提供编译错误?

abstract class Test<TItem> where TItem : IFoo
{
    public IEnumerable<IFoo> Foos { get; set; }

    public void Assign()
    {
        Foos = GetSomeSpecificList(); // works as expected
        Foos = GetSomeGenericList(); // compile error?
    }

    protected abstract ICollection<TItem> GetSomeGenericList();

    protected abstract ICollection<Foo> GetSomeSpecificList();
}

interface IFoo
{
}

class Foo : IFoo
{
}

我是否遗漏了某些东西,或者不是因为每个TItem都必须是IFoo,因此这个构造不可能违反类型安全吗?

1 个答案:

答案 0 :(得分:7)

您没有class约束,因此TItem可以是实现struct接口的IFoo类型。协方差需要参考类型。当您添加class约束时,它会毫无问题地进行编译。