2009-07-24 10 views
21

Me preguntaba si es posible agregar múltiples restricciones genéricas?C# Múltiples restricciones genéricas

que tienen un método Add que toma un objeto (ya sea por correo electrónico, teléfono o dirección), así que estaba pensando algo como:

public void Add<T>(T Obj) 
    where T : Address 
    where T : Email 
    where T : Phone 
{ 
    if (Obj is Address) 
     m_Address.Add(Obj as Address); 
    else if (Obj is Email) 
     m_Email.Add(Obj as Email); 
    else 
     m_Phone.Add(Obj as Phone); 
} 

pero aparece:

"A constraint clause has already been specified for type parameter 'T'. All of the constraints for a type parameter must be specified in a single where clause."

Respuesta

25

No puedes hacer eso. ¿Por qué no tener solo tres métodos y dejar que el compilador haga el trabajo duro por usted?

public void Add(Address address) { m_Address.Add(address); } 
public void Add(Email email) { m_Email.Add(email); } 
public void Add(Phone phone) { m_Phone.Add(phone); } 
+1

Por lo tanto, cómo enumerar más de una colección genérica tales ** ** inflexible de tipos de 'types' heterogénea como cualquier otro normales IEnumerable ? –

+0

@AngshumanAgarwal - Supongo que este no es un método de 'Agregar' en una colección, ya que no tendría mucho sentido. –

+1

Supongamos, si tengo la interfaz 'IWalk, IRun y ​​IBothWalkRun'. Ahora, quiero hacer una colección heterogénea fuertemente tipada de todos los tipos e iterar sobre tal que imprima todos los que IWalk, IRun e IBothWalkRun? ¿Eso tiene sentido? –

1

En ese caso, no me molestaría, ya que está comparando tipos de todos modos. Use esto:

public void Add(object Obj) 
{ 
    if (Obj is Address) 
     m_Address.Add(Obj as Address); 
    else if (Obj is Email) 
     m_Email.Add(Obj as Email); 
    else if (Obj is Phone) 
     m_Phone.Add(Obj as Phone); 
    else 
     return; 
} 

No creo que sean compatibles varias cláusulas. También podría tener sobrecargas de método por separado también.

5

¿Qué le parece crear una interfaz o clase base para esos tres tipos?

Pero al mirar su código, parece que no está usando genéricos suficientemente bien. El punto de usar genérico es que no necesita convertirlo en ningún tipo particular (en este caso, lo es).

9

CLR no permite la herencia múltiple, que es precisamente lo que está tratando de expresar. Desea que T sea Address, Email y Phone al mismo tiempo (supongo que esos son los nombres de las clases). Por lo tanto es imposible. Lo que es un evento más, todo este método no tiene sentido. Deberá introducir una interfaz base para las tres clases o utilizar tres sobrecargas de un método Add.

+9

@ Antón, creo que el OP está preguntando acerca de las restricciones O (no AND). –

2

En este caso, no obtendrá ningún beneficio real de los medicamentos genéricos. Simplemente crearía diferentes métodos Add para cada parámetro Type.

-4

donde T: C1, C2, C3. Separadas por comas por restricciones. Intenta usar la clase base o las interfaces.

+4

Esto no funciona, de ahí el menos 1 –

0

Como han dicho otros, en su caso específico, debe usar la herencia o la sobrecarga de métodos en lugar de los genéricos. Sin embargo, si necesita crear un método genérico con múltiples restricciones, puede hacerlo así.

public void Foo<T>() where T : Bar, IBaz, new() 
{ 
    // Your code here 
} 
Cuestiones relacionadas