2011-10-27 7 views
6

cuando lanzo int y float a objeto y los comparo, la igualdad siempre es falsa. ¿Por qué?¿Por qué los iguales no funcionan igual cuando los elementos se lanzan al objeto?

 float f = 0.0f; 
     int i = 0; 
     Console.WriteLine(f.Equals(i)); // true 
     Console.WriteLine(i.Equals(f)); // false 
     Console.WriteLine(i == f); // true 
     Console.WriteLine("----------------"); 
     object obf = f; 
     object obi = i; 
     Console.WriteLine(obf.Equals(obi)); // false 
     Console.WriteLine(obi.Equals(obf)); // false 
     Console.WriteLine(obi == obf); // false 
     Console.WriteLine("----------------"); 

Actualización: este no es el caso para el mismo tipo

 int i1 = 1; 
     int i2 = 1; 
     object oi1 = i1; 
     object oi2 = i2; 
     Console.WriteLine(oi1.Equals(oi2)); // true 
     Console.WriteLine(oi2.Equals(oi1)); // true 

Respuesta

10

Un float sólo es igual a otro float, y un int sólo es igual a otro int. Las únicas líneas que están regresando true son estos:

Console.WriteLine(f.Equals(i)); 
Console.WriteLine(i == f); 

En ambos casos, hay una conversión implícita del valor de i a float, por lo que son equivalentes a:

Console.WriteLine(f.Equals((float) i)); 
Console.WriteLine((float) i == f); 

Estas conversiones son simplemente conversiones normales requeridas para la resolución de sobrecarga de métodos y operadores.

Ninguno del resto de las líneas que implican la conversión implícita, por lo que están comparando los dos tipos diferentes, lo que da un resultado de false incluso cuando es comparan por su valor (que es el caso con todo el Equals llamadas). Es por eso que usar Equals en los valores de int devuelve true, porque eso es comparar dos valores del mismo tipo, por el valor.

En este caso:

Console.WriteLine(obi == obf); 

Ni siquiera se trata de comparar valores numéricos - se comparan las referencias para los objetos en caja. Como hay dos referencias diferentes, el resultado es false - y lo sería incluso si ambos valores fueran del tipo int.

+0

¿se maneja la conversión implícita en tiempo de compilación? –

+0

@CharlesLambert: Sí. Echa un vistazo a la IL y verás que se realiza. –

0

Cuando lanzas un tipo de valor de oponerse, lo que realmente es conseguir poner en el montón y == compara las referencias en ese punto, que será falso. (Simplificado)

0

Porque Equals compara la dirección de la referencia del objeto y los dos números se almacenan en diferentes ubicaciones. si compara los dos tipos de valores Equals se comporta correctamente, ya que ha sido anulado para float, int, string y otros tipos.

0

Porque están asignados a diferentes celdas de memeory. 2 objetos son = solo cuando son el mismo objeto. En la parte float e int obtiene un valor verdadero cuando prueba las 2 variables porque el tiempo de ejecución comprueba su valor. ¡eso es todo!

1

cuando se ha declarado dos objetos que hace referencia a un lugar de memoria diferente:

object obf = f;   // this simplified as new float(f) 
object obi = i;   // this simplified as new int(i) 

pero probar siguiente, dejar que un objeto para hacer referencia a otro:

obf = obi; 
Console.WriteLine(obf.Equals(obi)); 

MSDN, Object.Equals Method

La implementación predeterminada de Equals admite la igualdad de referencia para tipos de referencia e igualdad bit a bit para los tipos de valores. La referencia igualdad significa que las referencias de objeto que se comparan se refieren al mismo objeto . La igualdad de bits significa que los objetos que se comparan tienen la misma representación binaria.

3

Otros ya han explicado por qué == no funciona como se esperaba en sus objetos.

Con respecto a su edición: oi1.Equals(oi2) obras porque Equals es una función virtual y, por lo tanto, Int32.Equals(object) se llama, cuyo valor de retorno se define como sigue:

cierto si obj es una instancia de Int32 e iguales el valor de esta instancia; de lo contrario, falso.

Esto también explica por qué obi.Equals(obf)) retornos falsos: obf no es una instancia de Int32.

1

Para entender más sobre lo que sucede cuando se cuadro Tipos de valor, Shivprasad describe esta forma sucinta aquí:

Boxing and Unboxing

Ya que son el boxeo los tipos de valores a los objetos, que ahora está realizando la igualdad de referencia. Como ahora residen en diferentes ubicaciones de memoria en su ejemplo, devolverá falso.

Cuestiones relacionadas