Sé que puedo evitar el boxeo al agregar mi propia implementación Equals.¿Por qué no podemos anular Equals() en un tipo de valor sin boxeo?
public struct TwoDoubles
{
public double m_Re;
public double m_Im;
public TwoDoubles(double one, double two)
{
m_Re = one;
m_Im = two;
}
public override bool Equals(object ob)
{
return Equals((TwoDoubles)ob);
}
public bool Equals(TwoDoubles ob)
{
TwoDoubles c = ob;
return m_Re == c.m_Re && m_Im == c.m_Im;
}
}
No puedo llamar esto tanto una sobrecarga como una sobrecarga. Por la magia del tiempo de ejecución, llama correctamente a la implementación correcta Equals()
según el tipo de llamante.
¿Por qué no puedo anular y cambiar el tipo de parámetro a TwoDoubles
y dejar que el boxeo se produzca con la potencia del tiempo de ejecución según sea necesario? ¿Es porque C# no admite la contravariancia del parámetro (si ese es el motivo, entonces, por qué no es compatible ... parece un pequeño paso desde object o = new TwoDoubles()
)?
ACTUALIZACIÓN
Aclaración: object
es una parte de la jerarquía de herencia de una estructura. ¿Por qué no podemos especificar un tipo más derivado como parámetro para anular una implementación de un tipo menos derivado? Esto nos permitirá escribir:
public override bool Equals(TwoDoubles ob)
{
TwoDoubles c = ob;
return m_Re == c.m_Re && m_Im == c.m_Im;
}
que debería ser llamado cuando la variable es una TwoDouble incluso si dicha variable ha sido encasillados en un tipo de objeto.
Esto arrojará una excepción si 'ob' no es' TwoDoubles' en la función de anulación. Y no tiene sentido comprobar el tipo en el otro. – Magnus
@Magnus - corregido. Un descuido ya que estaba corriendo por la puerta –
Solo para que sepa, ya que anula el método 'Igual (objeto)', también debe anular el método 'GetHashCode()' también. –