miércoles, 28 de mayo de 2008

Cómo poner constraints en método genéricos

Una de las cosas que me olvidé de nombrar en el post sobre generics es cómo poner un constaint para un método, bueno, por ahora eso sólo así que acá está

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 restricciones

Vamos 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:

Eduardo León Pavón dijo...

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.

LgEaObNrAiReDlO dijo...

Gracias por la observación te respondo con una actualización del post.

Eduardo León Pavón dijo...

Hola. Muchas gracias por los nuevos ejemplos; ilustran bastante bien el uso de Generics. Un saludo!

LgEaObNrAiReDlO dijo...

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.