为什么以下代码会为通用案例提供编译错误?
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,因此这个构造不可能违反类型安全吗?
答案 0 :(得分:7)
您没有class
约束,因此TItem
可以是实现struct
接口的IFoo
类型。协方差需要参考类型。当您添加class
约束时,它会毫无问题地进行编译。