2014-05-12 16 views
6

Im folgenden Beispiel habe ich zwei Integritätsbedingungen, Foobar und IFoobar<T>, für Typ T in der generischen Klasse FoobarList<T>. Der Compiler gibt jedoch einen Fehler: Der Typ 'Foobar' kann nicht implizit in 'T' konvertiert werden. Eine explizite Konvertierung vorhanden ist (möglicherweise fehlt eine Guss?)Prioritäten mehrerer Integritätsbedingungen für einen generischen Typparameter

interface IFoobar<T> 
{ 
    T CreateFoobar(); 
} 

class Foobar : IFoobar<Foobar> 
{ 
    //some foobar stuffs 
    public Foobar CreateFoobar() { return new Foobar(); } 
} 

class FoobarList<T> where T : Foobar, IFoobar<T> 
{ 
    void Test(T rFoobar) 
    { 
     T foobar = rFoobar.CreateFoobar(); //error: cannot convert Foobar to T 
    } 
} 

Es scheint, der Compiler CreateFoobar als Methode in Foobar, aber nicht die, in IFoobar hält. Ich kann die Kompilierung beheben, indem Foobar in eine Basisklasse FoobarBase Dividieren und die Schnittstelle IFoobar in seiner abgeleiteten Klasse Umsetzung wie folgt:

interface IFoobar<T> 
{ 
    T CreateFoobar(); 
} 

abstract class FoobarBase 
{ 
    //some foobar stuffs 
} 

class Foobar : FoobarBase, IFoobar<Foobar> 
{ 
    public Foobar CreateFoobar() { return new Foobar(); } 
} 

class FoobarList<T> where T : FoobarBase, IFoobar<T> 
{ 
    void Test(T rFoobar) 
    { 
     T foobar = rFoobar.CreateFoobar(); 
    } 
} 

es umständlich ist Foobar in zwei Klassen zu unterteilen. Gibt es einen besseren Weg, das zu beheben?

+1

Hilft die Implementierung der Schnittstelle explizit? – Rotem

Antwort

4

werfen gerade rFoobar zu IFoobar<T>:

T foobar = ((IFoobar<T>)rFoobar).CreateFoobar(); 

diese Weise erhalten Sie eine Methode aufrufen, die du T kehrt nicht nur Foobar.

Wie Rotum schon sagt, in Foobar die Methode Ändern Implementierung verwenden explizite Schnittstelle funktioniert auch:

Foobar IFoobar<Foobar>.CreateFoobar() { return new Foobar(); } 

Auf diese Weise diese Methode nicht in T gefunden werden, so wird wieder an die Interface-Methode lösen.

Verwandte Themen