2010-12-06 9 views
2

ich so etwas wie dies wollen.Generisches Typ Extrakt von Generic Enclosing

class Foo<T>{...} 

class Boo<T>{ 

    Queue<T> stuff = new Queue<T>(); 

    public void Boo(Foo<T>){...}; 
} 

... 

//Extract the generic type - string - to define the type 
//of MyBoo. 
var MyBoo = new Boo(new Foo<string>()); 

ich den Fehler „generic Typ get‚Boo‘‚1‘erfordert Typ Argumente Ya, befestigte ich das Problem, indem Sie den Vorlagentyp Angabe explizit, aber ich würde gerne wissen, ob es war/ist ein Weg, diese Art implizit zu extrahieren, anstatt es ausdrücklich zu erwähnen.

Die anderen post may be related, aber ich bin mir nicht sicher.

+2

Es sollte "Bar" nicht "Boo" sein. – siride

+0

@siride ist es wirklich wichtig? – Andrey

+1

@Andrey: Nein, deshalb habe ich es als Kommentar hinterlassen. – siride

Antwort

3

Sie können es implizit nicht direkt mit dem Konstruktor eines generischen Typs tun, aber Sie könnten von einer generischen Methode, z. in einer nicht-generischen Klasse:

public static class Boo 
{ 
    public Boo<T> Create<T>(Foo<T> foo) 
    { 
     return new Boo<T>(foo); 
    } 
} 

Dann:

// myBoo will be inferred to be of type Boo<string> 
var myBoo = Boo.Create(new Foo<string>()); 

Natürlich tut es nicht hat Boo eine andere Klasse aufgerufen werden - es ist etwas völlig anderes sein könnte, und es könnte sein eine Instanzmethode von etwas anderem:

var factory = new BooFactory(); 
var myBoo = factory.Create(new Foo<string>()); 

der wichtige Punkt ist, dass es ein allgemeines Methode ist - Für generische Methoden können Typargumente abgeleitet werden, nicht jedoch für generische Typen.

3

Typ Inferenz funktioniert nur mit Methoden.So wenn Sie generische Methode haben und es i s klar, wie man den generischen Parameter ersetzt, wird er durch Compiler ersetzt. Für den Operator new funktioniert es nicht, also überlegen Sie, ob Sie eine Factory-Methode wie Create erstellen, die Instanzen von Boo erzeugt. Sonst unmöglich.