2014-05-12 17 views
6

W poniższym przykładzie mam dwa ograniczenia, Foobar i IFoobar<T>, na typ T w klasie ogólnej FoobarList<T>. Ale kompilator daje błąd: Nie można niejawnie przekonwertować typu "Foobar" na "T". Wyraźne konwersji istnieje (czy brakuje obsady?)Priorytety wielokrotnych ograniczeń ogólnego parametru typu

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

Wydaje kompilator uzna CreateFoobar jako metoda w foobar, ale nie jeden w IFoobar. można naprawić kompilacji dzieląc fooBar w FoobarBase klasy bazowej i realizacji IFoobar interfejsu w tej klasie określone, jak następuje:

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(); 
    } 
} 

jest kłopotliwe fooBar podzielić na dwie klasy. Czy istnieje lepszy sposób na rozwiązanie tego problemu?

+1

Czy implementacja interfejsu wyraźnie pomaga? – Rotem

Odpowiedz

4

Wystarczy rzucić rFoobar do IFoobar<T>:

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

ten sposób jesteś wywołanie metody, która zwraca T zamiast po prostu Foobar.

Jak sugeruje Rotem, zmieniając sposób, w Foobar używać wyraźny wdrożenie interfejsu działa zbyt:

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

ten sposób, że metoda ta nie będzie można znaleźć w T, więc znowu będzie rozwiązać metody interfejsu.

Powiązane problemy