c # compare dos valores generics

Posible duplicado:
¿No se puede aplicar el operador == a los tipos generics en C #?

He codificado algo como esto:

public bool IsDataChanged() { T value1 = GetValue2; T value2 = GetValue1(); return (valueInDB != valueFromView); } 

En este momento, la función no se comstack con el error ” Operator!! = ‘No se puede aplicar a los operandos de tipo’ T ‘y’ T ‘ “. ¿Qué debo hacer para que esta función funcione?

No puede usar operadores en tipos generics (a excepción de foo == null, que tiene una cubierta especial) a menos que agregue dónde T: clase para indicar que es un tipo de referencia (entonces foo == bar es legal)

Utilice EqualityComparer .Default para hacerlo por usted. Esto no funcionará en los tipos que solo proporcionan una sobrecarga de operador para == sin tampoco:

  • implementar IEquatable
  • reemplaza object.Equals ()

En general, implementar el operador == y no hacer al menos uno de estos sería una muy mala idea, así que no es probable que sea un problema.

 public bool IsDataChanged() { T value1 = GetValue2; T value2 = GetValue1(); return !EqualityComparer.Default.Equals(value1 , value2); } 

Si no restringe a IEquatable , la IEquatable defecto de EqualityComparer puede causar boxeo cuando se usa con tipos de valor si no implementan IEquatable (si controla los tipos que se utilizan, puede no importar). ¡Estoy asumiendo que estabas usando =! para el rendimiento, restringir al tipo genérico evitará el boxeo accidental a través de la ruta Object.Equals (objeto).

Su tipo necesita implementar la interfaz IComparable o IEquatable .

Probablemente necesites volver a escribir a! = B como! (A == b), o llamar explícitamente al método CompareTo () o Equals ().

Eso debería funcionar para ti.

 public bool test(T test, T test2) where T : class { return (test != test2); } 

Esto simplemente se pega de los ejemplos que se comentaron en su pregunta.

Puede sobrecargar el método .Equals () en sus objetos y cambiar su evaluación a:

 return (!valueInDB.Equals(valueFromView)); 

Suponiendo que valueInDB y valueFromView son objetos. Sus variables de ejemplo no tienen el mismo nombre que las utilizadas en la comparación, así que tuve que asumirlo.

EDITAR: ¡Has ganado por 3 segundos! Una nota sobre sobrecarga, si necesita comparar valores dentro de un tipo, los .Equals () básicos de la clase Object no serán suficientes, ya que solo hará una comparación de memoria para tipos complejos. Tendrá que sobrecargar y proporcionar la implementación de cómo quiere que se compare el objeto.

Genric no es nada, es una forma genralizada para otros tipos definidos en .net, así que los valores copare en generics 1. Debe implementar la interfaz IComparable o IEquatable. 1. Use .Equals (),. Compare los métodos que nos serán útiles

Pruébete