2010-12-10 10 views
6

Solo quería saber por qué las clases selladas no tienen restricciones de tipo genérico?¿Por qué no se permite que las clases selladas sean restricciones de tipo genérico?

Supongamos que tengo un simple fragmento de código en C# como bramido

public sealed class Base 
{ 
    public Base() { } 
} 

public class Derived<T> 
     where T : Base 
{ 
    public Derived() { } 
} 

cuando estoy una instancia del DerivedClass que estoy recibiendo 'Base' no es una restricción válida. Un tipo utilizado como restricción debe ser una interfaz, una clase no sellada o un parámetro de tipo.

Respuesta

10

Porque no tiene sentido que sea genérico. T podría solo ser Base, por lo que también podría hacer que sea un tipo no genérico para empezar.

¿Por qué quieres quererDerived para ser genérico aquí? ¿Por qué quieres querer un tipo llamado Base (lo que implica que debe ser un tipo base) para ser sellado?

+0

Supongo que está generando código. No es como si el generador de códigos supiera que alguien puso un "sellado" en la clase. – Gabe

+5

Y, por supuesto, con una lógica similar, no puede usar "objeto" como restricción, por el motivo opuesto; T ya va a ser convertible a objeto porque solo los tipos que son convertibles a objeto pueden usarse como argumentos de tipo, por lo que la restricción sería redundante. –

+0

@EricLippert Aunque no tiene ningún beneficio funcional. Tiene un beneficio de mantenimiento porque puede cambiar mucho más fácilmente un tipo de restricción genérico que reemplazar todas las instancias de la clase sellada dentro de un nuevo tipo. Aunque es un pequeño beneficio, no veo por qué uno haría cumplir un tipo genérico no sellado. – Measuring

2

¡Porque T nunca tendrá clases para niños! No tiene sentido tener ese tipo de genérico.

+0

En realidad, T podría tener clases secundarias si se revelaba después. Aunque si eso sucediera, el código existente continuaría funcionando como está escrito, por lo que esta situación no es un problema. – Brian

0

T no puede ser otra cosa que Base. Entonces, ¿de qué sirve convertirlo en genérico?

1

El compilador no quiere tomarse la molestia de crear algo genérico si solo hay una clase. Tenga en cuenta que se puede utilizar una clase sellada como una restricción genérica si la clase sellada se pasa como un parámetro de tipo. Por ejemplo, si uno tiene una clase

 
Class Foo(Of T, U As T) 

uno puede crear una instancia de esa clase, donde ambos parámetros de tipo genérico son del mismo tipo sellado, ya que también se podría crear instancias donde los parámetros de tipo se refieren a diferentes tipos.

Cuestiones relacionadas