修复 Hashtable 对象可能为 NULL 的拆箱警告

Fix Unboxing Warning with a Hashtable Object Possibly being NULL

提问人:Sacred 提问时间:7/27/2022 更新时间:7/27/2022 访问量:335

问:

我正在做一些项目,以更好地适应 C#。我在下面有这个代码示例:

Hashtable hashtable = new Hashtable();

for(int i = 0; i < s.Length; i++)
{
    if(hashtable.ContainsKey(s[i]))
    {
        hashtable[s[i]] = (int)hashtable[s[i]] + 1;
    }
    else
    {
        hashtable.Add(s[i], 1);
    }
}

for(int i = 0; i < s.Length; i++)
{
    if((int)hashtable[s[i]] == 1)
        return s[i];
}

return '\0';

我需要访问指定键处的元素,并通过向其添加 1 来更新它。 当我尝试将存储在哈希表中的对象转换为整数时,它会发出以下警告:

warning CS8605: Unboxing a possibly null value.
warning CS8605: Unboxing a possibly null value. 
    2 Warning(s)
    0 Error(s)

有没有办法避免这个警告?我认为 NULL 不可能出现在我的哈希表中,但它警告我以防万一。有没有办法在不拆箱的情况下访问哈希表中的这个值?

C# null 警告哈 希表 拆箱

评论

2赞 Charlieface 7/27/2022
用。文档说:“我们不建议将该类用于新开发。相反,我们建议您使用泛型类。Dictionary<char, int>HashtableDictionary<TKey,TValue>

答:

1赞 Scott Hannen 7/27/2022 #1

问题在于编译器并不知道您知道的有关执行的所有详细信息。它不会读取所有上下文并弄清楚可能发生或可能不会发生的事情。它的重点非常狭窄。

当您到达以下代码行时:

hashtable[s[i]] = (int)hashtable[s[i]] + 1;

...您知道该键存在于 中,并且该值是 .Hashtableint

编译器不知道这一点。它所知道的只是您正在检索一个值(可能是 null)并将其转换为 .int

它给你一个警告而不是一个错误,因为这可能是一个 .但它是可疑的,所以它会警告你,你正在做的事情可能会导致运行时错误。Objectint

(“取消装箱”意味着您要从引用类型中提取值类型。这里有一些关于这方面的信息。我们很少听到这个术语,因为我们使用泛型并且没有使用那么多。Object

您可以忽略该警告,但更简单的答案是不要使用它,因为有更好的集合类型。Hashtable.

我不知道是什么类型,但假设它包含字符串。您可以使用 .现在,如果字典包含键(您已经检查过),则该键不可能为 null。您已指定值为 all ,并且不能为 null。现在编译器不会警告您,因为您没有尝试将 null 转换为 .sDictionary<string, int>intintObjectint