son referencias programacion posible numeros nombra intencionada idénticas entre ejemplos diferencia cuándo comparar comparacion c# .net math boxing

c# - referencias - Compara dos objetos enteros para la igualdad sin importar el tipo



posible comparacion de referencias no intencionada c# (2)

En el caso 2, en realidad terminas llamando int.Equals(int) , porque ushort es implícitamente convertible a int . Esta resolución de sobrecarga se realiza en tiempo de compilación. No está disponible en el caso 3 porque el compilador solo conoce el tipo de int5 y int6 como object , por lo que llama object.Equals(object) ... y es natural que object.Equals devolverá false si los tipos de los dos objetos son diferente.

Podría usar la escritura dinámica para realizar el mismo tipo de resolución de sobrecarga en el momento de la ejecución, pero aún tendría un problema si intentara algo como:

dynamic x = 10; dynamic y = (long) 10; Console.WriteLine(x.Equals(y)); // False

Aquí no hay una sobrecarga que se maneje por long , por lo que llamará al objeto normal.

Una opción es convertir los valores a decimal :

object x = (int) 10; object y = (long) 10; decimal xd = Convert.ToDecimal(x); decimal yd = Convert.ToDecimal(y); Console.WriteLine(xd == yd);

Esto manejará comparando ulong con long también.

He elegido el decimal ya que puede representar exactamente cada valor de cada tipo de entero primitivo.

Me pregunto cómo podría comparar dos enteros en caja (ya sea con o sin signo) entre sí para la igualdad.

Por ejemplo, eche un vistazo a este escenario:

// case #1 object int1 = (int)50505; object int2 = (int)50505; bool success12 = int1.Equals(int2); // this is true. (pass) // case #2 int int3 = (int)50505; ushort int4 = (ushort)50505; bool success34 = int3.Equals(int4); // this is also true. (pass) // case #3 object int5 = (int)50505; object int6 = (ushort)50505; bool success56 = int5.Equals(int6); // this is false. (fail)

Estoy sorprendido de cómo comparar de forma confiable los tipos de enteros en caja de esta manera. No sabré cuáles son hasta el tiempo de ejecución, y no puedo limitarlos a los dos long , porque uno podría ser un ulong . Tampoco puedo convertirlos a ulong porque uno podría ser negativo.

La mejor idea que se me ocurre es hacer un ensayo de prueba y error hasta que pueda encontrar un tipo común o pueda descartar que no sean iguales, lo que no es una solución ideal.


Integer es un tipo de value . Cuando compara dos tipos de enteros, compiller comprueba sus valores .

El objeto es un tipo de reference . Cuando comparas dos objetos, compiller comprueba sus referencias .

La parte interesante está aquí:

object int5 = (int)50505;

Compiller perfoms operación de boxing , envuelve el tipo de valor en el tipo de referencia, y Equals comparará las referencias, no los valores.