2011-08-07 17 views
5

El uso del reflector o dotPeek, la puesta en práctica de la sobrecarga System.Linq.Data.Binary operador de igualdad se ve así:operador de igualdad dentro de la aplicación operador de igualdad

[Serializable, DataContract] 
public sealed class Binary : IEquatable<Binary> 
{ 
... 
    public static bool operator ==(Binary binary1, Binary binary2) 
    { 
     return ((binary1 == binary2) || (((binary1 == null) && (binary2 == null)) || (((binary1 != null) && (binary2 != null)) && binary1.EqualsTo(binary2)))); 
    } 

Debo estar perdiendo algo obvio, o hay un mecanismo que está teniendo lugar y del cual no estoy enterado (como llamar implícitamente objeto == dentro del cuerpo?). Lo admito, rara vez o nunca necesito sobrecargar a los operadores estándar.

¿Por qué esta implementación no da como resultado una recursión infinita (que una simple prueba muestra que no se repite infinitamente)? La primera expresión condicional es binary1 == binary2, dentro de la implementación de la sobrecarga del operador que recibiría una llamada si usabas binary1 == binary2 fuera de la implementación, y yo habría pensado, dentro también.

Respuesta

5

espero que esto sea un error en su decompilador. Redgate Reflector tenía/tiene el mismo error, y yo también tengo found it in ILSpy.

La razón por la cual es difícil de descompilar es porque prueba sutilmente las reglas de sobrecarga de C#. El código original probablemente era algo así como (object)obj1==(object)obj2, pero esta conversión no se puede ver en la propia IL. La conversión de cualquier tipo de referencia a un tipo base es un no-operativo en lo que respecta al tiempo de ejecución. Sin embargo, obtiene C# para elegir los códigos de operación de igualdad referencial en lugar de llamar a los operadores de igualdad sobrecargados.

IMO La forma correcta de implementar esto en un descompilador es descompilar siempre las comprobaciones de igualdad referencial en (object)obj1==(object)obj2 y luego optimizar las conversiones redundantes si no afectan la resolución de sobrecarga. Este enfoque solucionará problemas similares con la sobrecarga de métodos también.

2

Es evidentemente un error en su versión de ReSharper (y dotpeek). Versión 6.0 (6.0.2202.688) de ReSharper lo hace correctamente:

public static bool operator ==(Binary binary1, Binary binary2) { 
     if ((object)binary1 == (object)binary2) 
      return true; 
     if ((object)binary1 == null && (object)binary2 == null) 
      return true; 
     if ((object)binary1 == null || (object)binary2 == null) 
      return false; 
     return binary1.EqualsTo(binary2); 
    } 
+2

Lo siento, quise decir Reflector, no Resharper en mi publicación (que corregí). Es interesante que el Resharper actual lo haga bien, pero DotPeek (por la misma compañía) no lo hace. – hatchet

Cuestiones relacionadas