2010-03-31 30 views
7

Tengo una clase genérica que toma un tipo T. Dentro de esta clase tengo un método eran necesito para comparar un tipo a otro tipo TT tales como:Operadores de comparación binarios en tipos genéricos

public class MyClass<T> 
{ 
    public T MaxValue 
    { 
     // Implimentation for MaxValue 
    } 

    public T MyMethod(T argument) 
    { 
     if(argument > this.MaxValue) 
     { 
      // Then do something 
     } 
    } 
} 

La operación de comparación en el interior de MyMethod falla con un error del compilador CS0019. ¿Es posible agregar una restricción a T para hacer que esto funcione? Traté de agregar un where T: IComparable<T> a la definición de la clase en vano.

+0

Imposible = (. Sin embargo, hay una biblioteca de código abierto que trata de resolverlo, tiene que recordar el nombre ... – vittore

Respuesta

9

Agregar una restricción para asegurarse de que el tipo implementa IComparable<T> es un camino a seguir. Sin embargo, no se puede utilizar el operador < - la interfaz proporciona un método CompareTo a hacer lo mismo:

public class MyClass<T> where T : IComparable<T> { 
    public T MaxValue { 
     // Implimentation for MaxValue 
    } 

    public T MyMethod(T argument) { 
     if(argument.CompareTo(this.MaxValue) > 0){ 
      // Then do something 
     } 
    } 
} 

Si necesitan otros operadores numéricos que sólo comparación, la situación es más difícil, porque no se puede añadir la restricción de soporte para el operador + y no hay una interfaz correspondiente. Algunas ideas sobre esto can be found here.

+0

Batirme a eso. :) –

+0

Buena llamada Tomas. Encontré una publicación de blog en http://blogs.telerik.com/hristoborisov/posts/09-01-10/comparing_generic_types.aspx con respecto a este tema exacto poco después de hacer la pregunta que confirma lo que estás diciendo. –

3

No, no es posible, las restricciones del operador desafortunadamente no están permitidas en C#. where T: IComparable<T> debería funcionar bien, pero debe usar otra semántica: método CompareTo en lugar de>, < y == operadores.

+0

Sí y no estoy seguro de que el OP esté casado con el uso de operadores para este –

+0

Hmm ... Realmente no entendí tu comentario. – n535

+0

quiso decir que el OP no está obligado a usar esos operadores. Él puede usar de cualquier otra forma, mientras funcione. –

2

Tiene que usar el método IComparable<T>CompareTo.

1

En realidad, no es necesario nada especial aquí. Comparer<T>.Default ofrece un método .Compare que hará todo lo que necesite sin requerir restricciones genéricas adicionales (que tienden a propagarse de forma horrible). Funciona tanto para IComparable<T> como para IComparable, y admite clases, estructuras y Nullable<T>. Trabajo hecho.

Para información, así es como las implementaciones LINQ Max/Min funcionan, y asimismo List<T>.Sort. Entonces, una parte común y bien respaldada del BCL.