Ambos controles son diferentes. El primero comprueba la identidad , el segundo la igualdad . En general, dos términos son idénticos si se refieren al mismo objeto. Esto implica que son iguales. Dos términos son iguales, si sus valores son iguales.
En términos de programación, la identidad suele estar dividida por la igualdad de referencias. Si el puntero a ambos términos es igual (!), El objeto al que apuntan es exactamente el mismo. Sin embargo, si los punteros son diferentes, el valor de los objetos a los que apuntan puede ser igual. En C #, la identidad se puede verificar usando el Object.ReferenceEqualsmiembro estático , mientras que la igualdad se verifica usando el Object.Equalsmiembro no estático . Dado que está lanzando dos enteros a objetos (lo que se llama "boxeo", por cierto), el operador ==de objectrealiza la primera verificación, que está asignada por defecto Object.ReferenceEqualsy verifica la identidad. Si llama explícitamente al Equalsmiembro no estático , el envío dinámico da como resultado una llamada a Int32.Equals, que verifica la igualdad.
Ambos conceptos son similares, pero no iguales. Pueden parecer confusos al principio, ¡pero la pequeña diferencia es muy importante! Imagínese dos personas, a saber, "Alice" y "Bob". Ambos viven en una casa amarilla. Basado en la suposición de que Alice y Bob viven en un distrito, donde las casas solo difieren en su color, ambos podrían vivir en diferentes casas amarillas. Si comparas ambas casas, reconocerás que son absolutamente iguales, ¡porque ambas son amarillas! Sin embargo, no comparten la misma casa y, por lo tanto, sus casas son iguales , pero no idénticas . La identidad implicaría que viven en la misma casa.
Nota : algunos idiomas están definiendo al ===operador para verificar la identidad.
short myShort = 0; int myInt = 0; Console.WriteLine("{0}{1}{2}", myShort.Equals(myInt), myInt.Equals(myShort), myInt == myShort);Ahora compárelo con la realidad. ¿Tu predicción fue correcta? Si no es así, ¿puede explicar la discrepancia?