2013-12-02 5 views
0

У меня есть условие, которое сравнивает два целых числа, но оно никогда не возвращает true, даже оба числа будут равны.Оператор условия не возвращает 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"]; 

Даже Тхо оба значения станут равными, то условие будет возвращать ложь и не достигнет item.Items.Add(subCategory);

кто-нибудь знает, чего я не хватает? как одного и того же типа (INT) ... Спасибо

ответ

10

Попробуйте использовать 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)){ 
    //... 
} 
3

TrieViewItem.Tag имеет тип объекта. Когда вы присваиваете примитивы объектной ссылке, они преобразуются в соответствующие классы, в вашем случае Integer.

При сравнении ссылочных типов с использованием оператора == вы (если оператор не перегружен) сравнивают ссылки на объекты. Оператор == возвращает true, только если вы сравниваете ссылку на себя. Поскольку ваши целые значения обернуты двумя разными объектами, == никогда не вернет true.

Вы можете узнать больше о object equality на MSDN.

Правильный способ сравнения в вашем случае:

if (object.Equals(subCategory.Tag, item.Tag)) 
{ 
    ... 
} 
Смежные вопросы