Considere la clase siguiente:clase genérica y la interacción restricciones de tipo nivel Método
public class DerivedClassPool<TBase> where TBase : class
{
public TBase Get(Type componentType)
{
// Not important, but you get the idea
return Activator.CreateInstance(componentType) as TBase;
}
public TDerived SomeMethod<TDerived>() where TDerived : TBase
{
return Get(typeof(TBase)) as TDerived;
}
}
Tenga en cuenta que he restringido el argumento de clase genérica TBase
a ser una clase: where TBase : class
También he restringido el TDerived
genérica El argumento de método es TBase
o algo derivado de eso: where TDerived : TBase
.
me sale un error en la línea as TDerived
:
El parámetro de tipo 'TDerived' no se puede utilizar con el 'como' operador, ya que no tiene una restricción de tipo de clase ni una restricción 'clase'
entiendo que para evitar el error tengo que añadir la restricción class
, por lo que tendría:
where TDerived : class, TBase
¿Por qué tengo que hacer esto cuando TBase
ya está restringido para ser una clase y TDerived
está limitado a ser un TBase
o derivado de él?
Ver http://stackoverflow.com/questions/8002148/c-sharp-generics-contraints-propagation. Eric lo explica por ahí. –
@Jason, creo que se lee mejor con el 'pero'. – Joey
@Joey: Es suficiente. Odio cuando las oraciones comienzan con 'pero', aunque el uso de conjuntos para comenzar las oraciones se considera correcto en estos días. Culpo a mi profesor de inglés de secundaria. Era un fanático de las convenciones clásicas de inglés. –