c# - operador - Cómo resolver Operator ''!='' No se puede aplicar a operandos de tipo ''T'' y ''T''
el operador || no se puede aplicar a operandos del tipo string (3)
T
es un argumento de tipo y puede ser una class
o una struct
. Por lo tanto, el compilador no le permitirá realizar acciones que no existan en clases y estructuras.
las estructuras no tienen == y! = por defecto (pero se pueden agregar), esta es la razón por la cual el compilador se queja.
Si usa la palabra clave where
para agregar una restricción al argumento de tipo, el compilador le permitirá usar ese tipo / interface method / operators
constriñen que T
sea una class
public class Test<T> where T : class
{
public T Value
{
private T _Value;
get { return _Value; }
set
{
if (_value != value)
_Value = value;
}
}
}
O simplemente use Equals
lugar del operador ==
public class Test<T>
{
public T Value
{
private T _Value;
get { return _Value; }
set
{
if (!_value.Equals(value)
_Value = value;
}
}
}
Este fragmento de código funciona como se espera para el tipo int
:
public class Test {
public int Value
{
get { return _Value; }
set
{
if (_Value != value)
{
_Value = value;
}
}
}
private int _Value;
}
Cuando int
es reemplazado por el genérico T
, el compilador se queja con:
El operador ''! ='' No se puede aplicar a operandos de tipo ''T'' y ''T''
¿Por qué sucede esto y hay una manera de resolverlo?
T
puede ser de cualquier tipo. No puede usar ==
/ !=
En las estructuras, a menos que dichos operadores estén definidos en el tipo (struct).
using System.Collections.Generic;
public class Test<T>
{
public T Value
{
get { return _Value; }
set
{
// operator== is undefined for generic T; EqualityComparer solves this
if (!EqualityComparer<T>.Default.Equals(_Value, value))
{
_Value = value;
}
}
}
private T _Value;
}