2016-05-02 26 views
5

Dlaczego poniższy kod zawiera błąd kompilacji dla ogólnej wielkości liter?Typy kowariancji i generyczne

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 
{ 
} 

Am I czegoś brakuje lub nie jest to podane, że każdy TItem musi być IFoo a zatem niemożliwe jest ten konstrukt naruszyć bezpieczeństwo typu?

Odpowiedz

7

Nie masz ograniczenia class, dlatego TItem może być typu struct implementującego interfejs IFoo. Kowariancja wymaga typów referencyjnych. Po dodaniu ograniczenia class kompiluje się bez problemów.