2016-03-25 12 views
2

Bei den folgenden Typen implementiert und Code-Schnipsel:hinzufügen B <A<object>> zur Liste, wobei B A mit einem Wert Typ

interface IFoo<out T> { 
    T doThing(); 
} 

class Bar : IFoo<int> { 
    int doThing() => 0; 
} 

var list = new List<IFoo<object>> { 
    new Bar() //fails to compile 
}; 

Ich verstehe, dass es nicht möglich ist, ein Bar zu einem List<IFoo<object>> hinzuzufügen, weil Bar ‚s T ist ein Werttyp.

Gegeben, dass ich IFoo Typ-Safe, wie kann ich Bar oder die Sammlung ändern, so dass es möglich ist, sowohl IFoo<T> für einige Wert und Referenztypen zu speichern?

+0

Wie wollen Sie die Sammlung benutzen? –

+0

@ GuruStron nur für den Zugriff auf die 'DoThing'. Offensichtlich wäre es unsicher, ein Element mit einem bestimmten Typargument daraus zu extrahieren. Typ-Sicherheit auf "IFoo" ist reserviert für Orte, die sie direkt manipulieren, ich bin in Ordnung mit dem Verlust dieser Sicherheit, sobald es in der Sammlung gespeichert ist. – Kroltan

Antwort

3

Grundsätzlich sehe ich nur eine Option hier:

public interface IFoo<out T>:IFoo 
    { 
     T doThing(); 
    } 

    public interface IFoo 
    { 
     object doThing(); 
    } 

    public class Bar : IFoo<int> 
    { 
     public int doThing(){return 0;} 
     object IFoo.doThing() 
     { 
      return doThing(); 
     } 
    } 

    var list = new List<IFoo> 
    { 
     new Bar() 
    }; 
+0

Scheint legitim, das ist genau so, wie die zwei standardmäßigen "IEnumerable" -Schnittstellen (generisch und nicht) funktionieren. Ich werde das Akzeptieren für eine Weile halten, um alternative Lösungen nicht zu entmutigen. – Kroltan