remarks example cref c# generics

example - params comments c#



c#compare dos valores genéricos (5)

Posible duplicado:
¿No se puede aplicar el operador == a los tipos genéricos 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 compila 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?


Eso debería funcionar para ti.

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

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


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

Pruébete


No puede usar operadores en tipos genéricos (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<T> .Default para hacerlo por usted. Esto no funcionará en los tipos que solo proporcionan una sobrecarga de operador para == sin tampoco:

  • implementar IEquatable<T>
  • 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>() { T value1 = GetValue2; T value2 = GetValue1(); return !EqualityComparer<T>.Default.Equals(value1 , value2); }

Si no restringe a IEquatable<T> , la IEquatable<T> defecto de EqualityComparer puede causar boxeo cuando se usa con tipos de valor si no implementan IEquatable<T> (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).


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.


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 ().