2016-05-02 69 views
5

爲什麼下面的代碼給出一般情況下的編譯錯誤?協變和通用類型

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的,因此它是不可能出現這種結構違反類型安全?

回答

7

您沒有class約束,因此TItem可能是struct類型實現IFoo接口。協方差需要參考類型。當你添加class約束時,它編譯沒有問題。