2016-05-02 3 views
5

Warum gibt der folgende Code einen Kompilierungsfehler für den generischen Fall?Kovarianz und generische Typen

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

Bin ich etwas fehlt oder ist es nicht gegeben, dass jeder TItem ein IFoo sein muss, und es ist daher unmöglich, dieses Konstrukt Typsicherheit zu verletzen?

Antwort

7

Sie haben keine class Einschränkung, daher könnte TItem ein struct Typ sein, der die IFoo Schnittstelle implementiert. Covariance benötigt Referenztypen. Wenn Sie die class-Einschränkung hinzufügen, kompiliert es ohne Probleme.