Die spezifische Frage, warum können Sie nicht tun:
public class MyGenericClass<T> : T
Und Sie können dies tun:
public class MyGenericClass<T>
{
T obj;
}
Der Grund dafür ist, dass die CLR mag eine einzige kompilieren zu können, Version des Codes für MyGenericClass, die für jeden Referenztyp funktioniert, der für T angegeben wird.
Es kann dies für den zweiten Fall tun, da es problemlos T
durchersetzen kannund entsprechende Abgüsse einzufügen, entspricht in etwa:
public class MyGenericClass
{
object obj;
}
Aber für die Vererbung Version, dass Trick funktioniert nicht.
Auch viele nützliche Einrichtungen wären durch Schnittstellenbeschränkungen unmöglich zu beschreiben. Wenn Sie von einem Typ erben, können Sie viel mehr tun, als nur Methoden aufzurufen - Sie können sie auch überschreiben. Betrachten Sie dieses hypothetische Beispiel:
class MyBase
{
public virtual void MyVirtual() { }
}
class MyGenericDerived<T> : T
{
public override void MyVirtual()
{
Console.WriteLine("Overridden!");
}
}
MyBase obj = new MyGenericDerived<MyBase>();
obj.MyVirtual();
Was ich tun möchte, so etwas wie ein „Mix-in“ ist, wo MyGenericDerived Definitionen für virtuelle Funktionen liefert in welcher Basis es angewendet wird. Aber wie weiß der Compiler, dass T eine Methode namens MyVirtual haben wird, die außer Kraft gesetzt werden kann? Ich müsste T einschränken. Wie würde ich das über Schnittstellen ausdrücken? Es ist unmöglich. Die Verwendung von Schnittstellen zur Beschreibung von Einschränkungen ist keine angemessene Lösung, wenn Sie die Vererbung von Typparametern zulassen. Das ist ein weiterer Grund, warum es heute in der Sprache nicht existiert.
Was ist deine Motivation dafür? –
Warten Sie in C# 4.0 auf den dynamischen Typ. –