Неявное приведение объекта к строке для использования в 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();
    }
}

Если я добавлю объект этого типа в Hashtable, то я смогу найти объект, используя идентичную строку.
Но если Hashtable содержит строку, а не объект, она не может найти ее, когда я передаю объект.

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

Я пробовал переопределить оператор ==, и это не помогло.
Можно ли таким образом использовать неявное приведение в Hashtable?

6
задан demoncodemonkey 7 March 2012 в 17:17
поделиться