¿Hay alguna manera de especificar que un tipo genérico sea de un tipo o otro tipo?Especifique una restricción genérica de C# para que sea de clase A o clase B?
public class SoftDrink<T>
where T : TypeOne or TypeTwo
{ }
¿Hay alguna manera de especificar que un tipo genérico sea de un tipo o otro tipo?Especifique una restricción genérica de C# para que sea de clase A o clase B?
public class SoftDrink<T>
where T : TypeOne or TypeTwo
{ }
No, porque eso no tendría ningún sentido. Si intenta acceder a una función miembro de "T", ¿cómo puede el compilador decir a qué clase base intentar y resolver miembros?
Puede intentar crear una interfaz común para TypeOne y TypeTwo y hacer que la restricción especifique esa interfaz? ¿Qué estás tratando de lograr, exactamente?
No, sin embargo, podría restringir la clase en una base o interfaz común.
En el CLR en sí, las restricciones (excepto las especiales, como la nueva restricción) se almacenan de manera bastante simple: simplemente una lista de identificadores de tipo, básicamente. Entonces, realmente no hay "espacio" para operaciones lógicas como las especificadas ... no sin una revisión de la especificación CLR, o tal vez con algunos trucos realmente ingeniosos y feos.
Puede extraer la funcionalidad común de TypeOne y TypeTwo en una clase base o interfaz, y usar esa clase base o interfaz como restricción. De lo contrario, ¿cómo sabría el compilador qué podría hacer con T
?
public interface IBelch
{
void Belch();
}
public class Coke : IBelch
{
public void Belch()
{
}
}
public class GatorAde : IBelch
{
public void Belch()
{
}
}
public class SoftDrink<T>
where T : IBelch
{
public void DrinkFast(T drink)
{
drink.Belch();
}
}
No puede. Lo mejor que puede hacer es usar una clase base común para los dos, o una interfaz común implementada por ambos como una restricción de tipo único.
Puede hacer que TypeOne y TypeTwo hereden una interfaz y luego haga lo siguiente.
public class SoftDrink<T>
where T: IMyType
{}
siempre se puede hacer una verificación de tiempo de ejecución en contra del tipo:
class TypeOne
{
int _integer = 0;
}
class TypeTwo
{
int _integer = 3;
}
class TypeThree
{
}
class SoftDrink<T>
{
public SoftDrink()
{
if (typeof(T) != typeof(TypeOne) && typeof(T) != typeof(TypeTwo))
{
throw (new Exception("Sorry, but T must be TypeOne or TypeTwo"));
}
}
}
//this works:
SoftDrink<TypeOne> t1 = new SoftDrink<TypeThree>();
//throws an exception:
SoftDrink<TypeThree> t3 = new SoftDrink<TypeThree>();
Aggh, pásame por un minuto; Yo iba a sugerir lo mismo. Por supuesto, no es verdad O-O, pero funcionaría. –
Yo sólo estaba tratando de trabajar en torno a un tema en particular, sin poner las dos clases bajo una base de interfaces o clase similar. – Scott
Si profundiza en el problema que está teniendo, tal vez podamos ayudarlo a encontrar una solución alternativa. :) – Sapph
Bueno, fue más una curiosidad que otra cosa. Básicamente, hay dos métodos en FormatXML, uno que tomó TypeA, el otro TypeB. Una solución fácil sería hacer que TypeA y TypeB implementen IXMLFormattable o algo similar. – Scott