Hãy nói rằng chúng tôi có lớp học này:đúc ngầm của một đối tượng chuỗi, để sử dụng trong một 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();
}
}
Nếu tôi thêm một đối tượng kiểu này cho một Hashtable, sau đó tôi có thể tìm thấy các đối tượng sử dụng chuỗi giống hệt nhau.
Nhưng nếu Hashtable có chứa chuỗi không phải là đối tượng, nó không tìm thấy nó khi tôi vượt qua đối tượng.
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
Tôi đã cố gắng ghi đè toán tử == và nó không có sự khác biệt.
Có thể sử dụng tính năng đúc ngầm trong Hashtable theo cách này không?
Bạn đang vi phạm một trong các thuộc tính thiết yếu của Equals: "x.Equals (y) trả về cùng giá trị với y.Equals (x)." – CodesInChaos