2010-01-15 9 views

Respuesta

8

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?

+0

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

+1

Si profundiza en el problema que está teniendo, tal vez podamos ayudarlo a encontrar una solución alternativa. :) – Sapph

+0

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

2

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.

2

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(); 
    } 
} 
3

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.

0

Puede hacer que TypeOne y TypeTwo hereden una interfaz y luego haga lo siguiente.

public class SoftDrink<T> 
    where T: IMyType 
    {} 
2

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>(); 
+1

Aggh, pásame por un minuto; Yo iba a sugerir lo mismo. Por supuesto, no es verdad O-O, pero funcionaría. –

Cuestiones relacionadas