尝试在哈希表中查找值时可能出现意外的引用比较问题

Possible unintended reference comparison issue when trying to find a value in hashtable

请问我做错了什么:

Hashtable  dd = new Hashtable () ;
        for (int i = 0; i < 1000000; i++)
        {
            dd.Add(i, i.ToString());
        }

var  key = dd.Values.OfType<string>().FirstOrDefault(s => dd[s] == "10000");

它一直显示以下错误:

possible unintended reference comparison to get a value
comparison cast the left hand to string

Hashtable 不是泛型类型,因此 dd[s] 的 return 是 object。当您使用 == 并且任何一方在编译时都是 object 时,您得到的是引用比较,而不是值比较。这是因为所有运算符都是 static 并受编译器约束,而 object 中的 == 执行引用比较。

要解决此问题,请使用虚拟 .Equals,它会在 运行-time

查找正确的方法
dd[s].Equals("10000")  

object.Equals,检查null然后调用虚拟.Equals

object.Equals(dd[s], "1000000")

请注意,这只是一个警告,不是一个错误,您的代码将编译,但可能会产生意外结果。

但是,如果您可以使用更新的 class,那么使用 HashtableDictionary<TKey, TValue>

的通用形式可能会更加强大

编辑:最后一点,即使在应用 .Equals 之后,您的代码也可能无法正常工作,因为使用 dd[s] 您正在创建密钥查找,而是传递一个值。

Hashtable 是一个旧结构,您应该避免使用它。它不使用 generics,所以你从中得到的任何对象都是 object.

当您使用 == 运算符比较 dd[s]"10000" 时,它将使用引用比较(例如,两个 object 是否引用同一点在内存中),而你 可能 打算 any 字符串匹配 "10000" 结果相等。编译器警告你这可能不会给你你想要的东西。