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?
Czy implementacja interfejsu wyraźnie pomaga? – Rotem