Digamos que tenemos esta clase:Conversión implícita de un objeto de cadena, para su uso en un Hashtable
public class Moo
{
string _value;
public Moo(string value)
{
this._value = value;
}
public static implicit operator string(Moo x)
{
return x._value;
}
public static implicit operator Moo(string x)
{
return new Moo(x);
}
public override bool Equals(object obj)
{
if (obj is string)
return this._value == obj.ToString();
else if (obj is Moo)
return this._value == ((Moo)obj)._value;
return base.Equals(obj);
}
public override int GetHashCode()
{
return _value.GetHashCode();
}
}
Si añado un objeto de este tipo a una tabla hash, entonces puedo encontrar el objeto con la cuerda idéntica.
Pero si la Hashtable contiene la cadena, no el objeto, no lo encuentra cuando paso el objeto.
Moo moo = new Moo("abc");
bool result1 = moo == "abc"; //true
bool result1a = moo.Equals("abc"); //true
bool result2 = "abc" == moo; //true
bool result2a = "abc".Equals(moo); //true
bool result2b = ((object)"abc").Equals(moo); //false
Hashtable hash = new Hashtable();
hash[moo] = 100;
object result3 = hash[moo]; //100
object result4 = hash["abc"]; //100
hash = new Hashtable();
hash["abc"] = 100;
object result5 = hash[moo]; //null!!!!
object result6 = hash["abc"]; //100
He intentado reemplazar al operador == y no hizo ninguna diferencia.
¿Es posible utilizar la conversión implícita en una Hashtable de esta manera?
Está violando una de las propiedades esenciales de Equals: "x.Equals (y) devuelve el mismo valor que y.Equals (x)." – CodesInChaos