Como poner un constraint a un método
public void Probar<T>(T param) where T : IBase { }
En este código simplemente decimos que el tipo T del parámetro param debe implementar la interfaz IBase, esto hasta la próxima.
Actualización
Como indica mi colega Eduardo el ejemplo que puse es muy malo, en realidad casi no sirve para nada, en casos muy raros que si bien se me ocurren son muy confusos, veámos casos en los que un constraint es útil en un método
Tipos de restriccionesVamos a ver tres casos en los que las restricciones pueden ser útiles en los métodos
/// <summary> /// new() indica que T tiene que tener un constructor sin parámetros /// </summary> public void Probar2<T>(T param) where T : new() { //Si quito la restrucción no puedo hacer esto //porque T no tiene implícitamente un constructor sin parámetros T var = new T(); } /// <summary> /// class indica que T será un tipo por referencia /// </summary> public void Probar3<T>(T param1, T param2) where T : class { } /// <summary> /// struct indica que T tiene que se un tipo no Nullable /// </summary> public void Probar4<T>(T param1, T param2) where T: struct { //Si quito la restricción no puedo hacer esto //porque el método Nullable.Compare espere dos tipos nos nullables (underlying types) //sin embargo se pueden pasar estructuras Nullable.Compare<T>(param1, param2); }
Bueno, espero que les sirva y gracias Eduardo por la observación
4 comentarios:
Hola! me surge una cuestión ¿cuál es la diferencia semántica con el siguiente código?
public void Probar(IBase param)
{
}
Muchas gracias y un saludo desde España.
Gracias por la observación te respondo con una actualización del post.
Hola. Muchas gracias por los nuevos ejemplos; ilustran bastante bien el uso de Generics. Un saludo!
Gracias a vos Eduardo por tomarte el tiempo de leer y por las dudas, a veces uno comete el error de obviar cosas porque....uno no tiene la capacidad natural de explicar de un modo claro, ahora el post es mejor y más útil para todos, saludos.
Publicar un comentario