0
foreach (Control c in panPrev.Controls)
{
if (c.Tag == "move")

效果很好,但会产生警告:可能的意外参考比较;要进行值比较,请将左侧转换为“字符串”

foreach (Control c in panPrev.Controls)
{
if (c.Tag.ToString() == "move")  // this produce NullReferenceException.

该怎么办?

4

3 回答 3

5

您没有接受警告提供的建议。这将是:

if ((string)c.Tag == "move")

如果为空,这将正常工作Tag,而尝试调用.ToString可能的null引用会使您遇到异常。

您完全需要这样做的原因是因为.Tag它被声明为 an object,因此==在 anobject和 a之间使用运算符string使用引用相等,而将 astring与 a进行比较使用定义string的重载来比较实际值。==string

于 2012-06-22T20:08:53.670 回答
1

Tag是 type object,这就是你收到警告的原因。如果您知道它是一个字符串并且它应该始终是一个字符串,那么您应该强制转换它(C 风格),因为如果Tag不是字符串(但应该是),您将快速捕获错误。

于 2012-06-22T20:10:29.077 回答
1

c.Tag是一个对象,所以 object == string 进行引用比较。

当然,Object 可以为 null,因此Tag.ToString()在这种情况下调用可能会引发 null 引用异常。

您应该按照警告的建议进行操作,并Tag转换为字符串:

if ((string)c.Tag == "move")
于 2012-06-22T20:10:39.550 回答