提问人:Sacred 提问时间:7/27/2022 更新时间:7/27/2022 访问量:335
修复 Hashtable 对象可能为 NULL 的拆箱警告
Fix Unboxing Warning with a Hashtable Object Possibly being NULL
问:
我正在做一些项目,以更好地适应 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 不可能出现在我的哈希表中,但它警告我以防万一。有没有办法在不拆箱的情况下访问哈希表中的这个值?
答:
1赞
Scott Hannen
7/27/2022
#1
问题在于编译器并不知道您知道的有关执行的所有详细信息。它不会读取所有上下文并弄清楚可能发生或可能不会发生的事情。它的重点非常狭窄。
当您到达以下代码行时:
hashtable[s[i]] = (int)hashtable[s[i]] + 1;
...您知道该键存在于 中,并且该值是 .Hashtable
int
编译器不知道这一点。它所知道的只是您正在检索一个值(可能是 null)并将其转换为 .int
它给你一个警告而不是一个错误,因为这可能是一个 .但它是可疑的,所以它会警告你,你正在做的事情可能会导致运行时错误。Object
int
(“取消装箱”意味着您要从引用类型中提取值类型。这里有一些关于这方面的信息。我们很少听到这个术语,因为我们使用泛型并且没有使用那么多。Object
您可以忽略该警告,但更简单的答案是不要使用它,因为有更好的集合类型。Hashtable.
我不知道是什么类型,但假设它包含字符串。您可以使用 .现在,如果字典包含键(您已经检查过),则该键不可能为 null。您已指定值为 all ,并且不能为 null。现在编译器不会警告您,因为您没有尝试将 null 转换为 .s
Dictionary<string, int>
int
int
Object
int
评论
Dictionary<char, int>
Hashtable
Dictionary<TKey,TValue>