【问题标题】:C# Condition statement doesn't return trueC# 条件语句不返回 true
【发布时间】:2013-12-17 16:00:56
【问题描述】:

我有一个比较两个整数的条件,但即使两个数字相等,它也永远不会返回 true。

foreach (TreeViewItem item in Categories.Items)
            {
                if (subCategory.Tag == item.Tag)
                {
                    item.Items.Add(subCategory);
                }
            }

都是 TreeviewItem 的属性

TreeViewItem catItem = new TreeViewItem();
catItem.Tag = (int)row["CategoryID"];
Categories.Items.Add(catItem);

TreeViewItem subCategory = new TreeViewItem();
subCategory.Tag = (int)row["CategoryID"];

即使两个值相等,条件也会返回 false 并且不会达到 item.Items.Add(subCategory);

有人知道我错过了什么吗? 两者都是同一类型(int)... 谢谢

【问题讨论】:

    标签: c# return conditional-statements


    【解决方案1】:

    TrieViewItem.Tag 是对象类型。当您将原语分配给对象引用时,它们会转换为相应的类,在您的情况下为整数。

    当您使用 == 运算符比较引用类型时,您(除非运算符被重载)比较对象引用。 == 运算符仅在您比较对其自身的引用时才会返回 true。由于您的整数值包含在两个不同的对象中,因此 == 永远不会返回 true。

    您可以在 MSDN 上阅读有关 object equality 的更多信息。

    在您的情况下比较的正确方法是:

    if (object.Equals(subCategory.Tag, item.Tag))
    {
       ...
    }
    

    【讨论】:

      【解决方案2】:

      尝试改用Equals

      if (object.Equals(subCategory.Tag, item.Tag)){
       //...
      }
      

      像你做的比较会比较参考,所以它们当然不会相等。

      您也可以将每个Tag 转换为int 并比较转换结果,但在这种情况下使用Equals 更方便。

      注意一个对象也有一个Equals方法,你也可以使用这个,但是如果对象是null就不安全了。

      //subCategory.Tag should not be null
      if (subCategory.Tag.Equals(item.Tag)){
         //...
      }
      

      【讨论】: