este vídeo de YouTube en realidad pone de manifiesto la importancia de las restricciones genéricas https://www.youtube.com/watch?v=GlqBRIgMgho.
Ahora va a continuación una respuesta textual larga.
"Generic ayuda a desacoplar la lógica del tipo de datos. Así que adjuntar cualquier tipo de datos con cualquier lógica para alta reusabilidad.”
Pero muchas veces de cierta lógica se puede conectar a sólo tipos de datos específicos.
public class CompareNumeric<UNNKOWDATATYPE>
{
public bool Compareme(UNNKOWDATATYPE v1, UNNKOWDATATYPE v2)
{
if (v1 > v2)
{return true;}
else
{return false;}
}
}
Por ejemplo, una clase genérica simple que compara si un número es mayor que otro número. Ahora, la comparación mayor y menor es muy específica para los tipos de datos numéricos. Este tipo de comparación no se puede hacer en tipos no numéricos como cadena.
Así que si algunos usan las clases con "int", el tipo es perfectamente válido.
CompareNumeric<int> obj = new CompareNumeric<int>();
bool boolgreater = obj.Compare(10,20);
Si alguien lo utiliza con el tipo de datos "doble", vuelve a ser perfectamente válido.
CompareNumeric<double> obj = new CompareNumeric<double>();
bool boolgreater = obj.Compare(100.23,20.45);
Pero el uso de un tipo de datos de cadena con esta lógica dará resultados no deseados. Por lo tanto, nos gustaría restringir o poner una restricción sobre qué tipo de tipos se pueden asociar a una clase genérica, esto se logra mediante el uso de "restricciones genéricas".
CompareNumeric<string> obj = new CompareNumeric<string>();
bool boolgreater = obj.Compare(“interview”,”interviewer”);
tipo genérico puede ser restringido mediante la especificación de tipo de datos utilizando el “WHERE” palabra clave después de la clase genérica, como se muestra en el código siguiente. Ahora, si algún cliente intenta adjuntar el tipo de datos "cadena" con la clase siguiente, no lo permitirá, evitando así resultados indeseables.
public class CompareNumeric<UNNKOWDATATYPE> where UNNKOWDATATYPE : int, double
{
}
http://msdn.microsoft.com/en-us/library/d5x73970.aspx – zebrabox