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?
Hilft die Implementierung der Schnittstelle explizit? – Rotem