2016-05-02 18 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は、IFooインターフェイスを実装するstructタイプになる可能性があります。共分散には参照型が必要です。 class制約を追加すると、問題なくコンパイルされます。