La pregunta específica, por qué no se puede hacer esto:
public class MyGenericClass<T> : T
Y usted puede hacer esto:
public class MyGenericClass<T>
{
T obj;
}
La razón es que el CLR le gusta ser capaz de compilar una sola versión del código para MyGenericClass que funcionará para cualquier tipo de referencia especificado para T.
Puede hacer esto para el segundo caso, porque puede reemplazar silenciosamente T
con object
e inserte los moldes apropiados, más o menos equivalente a:
public class MyGenericClass
{
object obj;
}
Pero para la versión de la herencia, ese truco no funciona.
Además, muchas instalaciones útiles serían imposibles de describir a través de las limitaciones de la interfaz. Cuando hereda de un tipo, puede hacer mucho más que solo llamar a métodos; también puede anularlos. Considere este ejemplo hipotético:
class MyBase
{
public virtual void MyVirtual() { }
}
class MyGenericDerived<T> : T
{
public override void MyVirtual()
{
Console.WriteLine("Overridden!");
}
}
MyBase obj = new MyGenericDerived<MyBase>();
obj.MyVirtual();
Lo que yo quiero hacer hay algo así como una "mezcla en-", donde MyGenericDerived suministra las definiciones de las funciones virtuales en cualquier base de que se aplica a. Pero, ¿cómo sabe el compilador que T tendrá un método llamado MyVirtual que se puede anular? Tendría que poner una restricción en T. ¿Cómo podría expresar eso a través de las interfaces? Es imposible. El uso de interfaces para describir restricciones no es una solución adecuada una vez que permite la herencia de los parámetros de tipo. Esa es otra razón por la cual no existe en el lenguaje de hoy.
¿Cuál es su motivación para intentar hacer esto? –
Espere el tipo dinámico en C# 4.0. –