2010-07-08 18 views
5

que corrió a lo siguiente:unicidad aplica los métodos y las limitaciones

public void AddConfig<T>(Config c) where T : BaseTypeA 
{ 
// do stuff 
} 

public void AddConfig<T>(Config c) where T : BaseTypeB 
{ 
// do stuff 
} 

Me gustaría ser capaz de hacer esto. Pero creo que es imposible. El compilador ignora las restricciones. ¿Por qué? (Sé que es por diseño).

Creo que mis 2 opciones son:

  1. Haga 2 funciones distintas.
  2. Realice 2 clases de configuración distintas.

Derecho?

+1

Cuando se tiene un método genérico que doesn No use el tipo genérico en ningún otro lugar en la firma del método, otra cosa está mal con el diseño de su método. –

Respuesta

4

Si te refieres a la misma clase, entonces estás en lo cierto (no creo que el compilador verifique para asegurarse de que BaseTypeA y BaseTypeB no se puedan convertir entre sí, que es lo que necesitarías verificar para asegurarte de que son métodos únicos, es decir, algo así como where T : BaseTypeA && T !: BaseTypeB si entiendes lo que quiero decir).

Dicho esto, sin embargo, ¿por qué no haces algo como esto:

interface IConfigurable 
{ 
     void AddConfig(Config c) 
} 

public class BaseTypeA : IConfigurable 

public class BaseTypeB : IConfigurable 
+1

Buen ángulo. No he pensado en eso. – Jeroen

4

restricciones no son una parte de la firma. Eso es por diseño.

Si usted está interesado en leer más de cien comentarios de personas que piensan que las restricciones deben ser parte de la firma, echa un vistazo a los comentarios a mi blog ingeniosamente titulado Constraints Are Not Part Of The Signature.

+0

Buena pieza. Sin embargo, nunca me encontré con eso. – Jeroen

Cuestiones relacionadas