2011-07-31 30 views
9

que tienen una clase genérica MyClass<T> donde T debe única ser esos tipos que se pueden comparar.limitantes tipos genéricos en C#

Esto significaría solo tipos numéricos y clases donde se han definido los métodos para los operadores relacionales. Cómo hago esto ?

Respuesta

10

No puede restringir a los operadores, pero puede restringir a las interfaces. Por lo tanto, está intentando utilizar >=, <=, ==, pero puede usar CompareTo, Equals.

where T : IComparable<T> 

Interface documentation

Esta interfaz le trae el método CompareTo, que es útil para el pedido relacional (mayor que, menor que, etc.). Los primitivos y las cadenas implementan esto ya, pero necesitaría implementar esto para sus propios tipos personalizados. Se podría utilizar de esta manera

void SomeMethod<T>(T alpha, T beta) where T : IComparable<T> 
{ 
    if (alpha.CompareTo(beta) > 0) 
    { 
     // alpha is greater than beta, replaces alpha > beta 
    } 
    else if (alpha.CompareTo(beta) < 0) 
    { 
     // alpha is less than beta, replaces alpha < beta 
    } 
    else 
    { 
     // CompareTo returns 0, alpha equals beta 
    } 
} 

Equals se obtiene por defecto como un método virtual en object. Desea anular este método en sus propios tipos personalizados si desea usar algo diferente a la igualdad referencial. (También se recomienda fuertemente para anular GetHashCode al mismo tiempo.)

+0

IComparable no tiene el método de igual a igual, eso es IEquatable –

+0

@ Nathan, estás en lo correcto, pero 'Equals' es un método virtual en objetos por defecto, así que no mencioné la interfaz en la respuesta. Se actualizará para mayor claridad. –

+0

Lo hice, pero ahora obtengo el error 'operator rohit89

3

Puede limitar el tipo genérico a solo las clases que implementan la interfaz IComparable utilizando el modificador where.

public class MyClass<K> where K : IComparable 
{ 
    .... 
} 
3

Si desea limitarlo a las cosas que se pueden comparar, puede hacer cosas como:

public class MyClass<T> where T:IComparable 
-1

Si la velocidad es de relevancia el uso de los métodos sugeridos te dará una enorme pérdida de rendimiento. Si no, todas las cosas sugeridas funcionan bien.

Este es un problema que tengo que abordar muy a menudo ya que los tipos de datos primitivos en C# no tienen un tipo de datos "Numérico" como a menudo se sugieren y exigen aquí.

Tal vez la próxima versión de C# lo tendrá, pero lo dudo ...

+0

¿Por qué crees que el rendimiento se degrada? No estoy muy seguro de por qué mencionó el tipo de datos numéricos aquí. ¿Qué tipo numérico te gustaría tener? – oleksii

+0

Hice muchas pruebas recientemente, porque en nuestro marco necesitamos un sistema de tipos muy flexible. Supongamos que tiene una matriz genérica de diferentes tipos de datos primitivos. ¿Cómo te gustaría ejecutar a través de una matriz? ¿Cómo realizarías una comparación de una matriz genérica? ¿Cómo haría las operaciones matemáticas en esta matriz, ya que hay operaciones definidas en un tipo genérico de datos genéricos? Esta es una razón para tener una restricción de tipo de datos numéricos. Tal vez este es un texto muy poco para explicar mi situación, pero hay muchos hilos por aquí que muestran el problema. – msedi