我的类的实例不希望作为字典键正确地与字符串互换

tho*_*rn̈ 0 c# dictionary equals wrapper gethashcode

我创建了一种字符串包装类,并希望将其实例用作与常用字符串互换的字典键.我推翻GetHashCode,并Equals找来似乎奇怪的结果.我已经解决了这个问题.请查看我的代码并解释为什么第二次查找返回null.

void Main()
{
    var foo = new StringWrapper("foo");
    var h = new Hashtable {{ foo, "bar" }};
    Console.WriteLine(h["foo"]);
    Console.WriteLine(h[foo]); // null ??
}

public class StringWrapper
{
    readonly string wrapped;
    public StringWrapper(string s) {
        wrapped = s;
    }
    public override bool Equals(object obj) {
        return wrapped.Equals(obj);
    }
    public override int GetHashCode() {
        return wrapped.GetHashCode();
    }
    public override string ToString() {
        return wrapped;
    }
}
Run Code Online (Sandbox Code Playgroud)

Aas*_*set 6

请记住,in Equals(object obj),obj不会是a string,它将是StringWrapper- 并且string永远不会说它等于不是a的东西string.您需要从中提取包装的字符串obj.请记住,您应该检查null并考虑如果某人使用StringWrapper其他东西而不是将其放入哈希表,obj也可以是任何其他类型.