De acuerdo con la documentación del operador ==
en MSDN,¿No se puede aplicar el operador == a los tipos genéricos en C#?
Para los tipos de valor predefinido, el operador igualdad (==) devuelve verdadero si los valores de sus operandos son iguales, falso en caso contrario. Para los tipos de referencia que no sean cadenas, == devuelve verdadero si sus dos operandos se refieren al mismo objeto . Para el tipo de cadena, == compara los valores de las cadenas. Los tipos de valores definidos por el usuario pueden sobrecargar el operador == (ver operador). Entonces, ¿pueden los tipos de referencia definidos por el usuario , aunque por defecto == se comporta como se describe para ambos tipos de referencia predefinidos y definidos por el usuario.
¿Por qué no se compila este fragmento de código?
void Compare<T>(T x, T y) { return x == y; }
me sale el error operador '==' no se puede aplicar a operandos de tipo 'T' y 'T'. Me pregunto por qué, ya que, según tengo entendido, el operador ==
está predefinido para todos los tipos?
Edit: Gracias a todos. Al principio no me di cuenta de que la declaración era solo acerca de los tipos de referencia. También pensé que la comparación bit por bit se proporciona para todos los tipos de valores, que ahora sé que es no correctos.
Pero, en caso de que esté usando un tipo de referencia, ¿utilizaría el operador ==
la comparación de referencia predefinida, o usaría la versión sobrecargada del operador si un tipo lo definiera?
Editar 2: Por prueba y error, nos enteramos de que el operador ==
utilizará la comparación de referencia predefinida cuando utilice un tipo genérico sin restricciones. En realidad, el compilador usará el mejor método que pueda encontrar para el argumento de tipo restringido, pero no buscará más. Por ejemplo, el código de abajo siempre imprimirá true
, incluso cuando Test.test<B>(new B(), new B())
se llama:
class A { public static bool operator==(A x, A y) { return true; } }
class B : A { public static bool operator==(B x, B y) { return false; } }
class Test { void test<T>(T a, T b) where T : A { Console.WriteLine(a == b); } }
Véase mi respuesta de nuevo por la respuesta a su pregunta de seguimiento. –
Puede ser útil comprender que incluso sin genéricos, hay algunos tipos para los cuales ''==' no está permitido entre dos operandos del mismo tipo. Esto es cierto para los tipos 'struct' (excepto los tipos" predefinidos '') que no sobrecargan el 'operador =='. Como un ejemplo simple, intente esto: 'var map = typeof (string) .GetInterfaceMap (typeof (ICloneable)); Console.WriteLine (map == map);/* error en tiempo de compilación */' –
Continuando mi propio comentario anterior. Por ejemplo (ver [otro hilo] (https://stackoverflow.com/questions/6379915/)), con 'var kvp1 = new KeyValuePair(); var kvp2 = kvp1; ', entonces no puede verificar' kvp1 == kvp2' porque 'KeyValuePair <,>' es una estructura, no es un tipo predefinido de C# y no sobrecarga el 'operador =='. Sin embargo, un ejemplo viene dado por 'var li = new List (); var e1 = li.GetEnumerator(); var e2 = e1; 'con el que no se puede hacer' e1 == e2' (aquí tenemos la estructura anidada 'List <>. Enumerator' (llamado' '" List'1 + Enumerator [T] "' 'por el tiempo de ejecución)) que no sobrecarga '=='). –