2014-09-24 3 views
0

У меня очень простой оператор if, но он всегда возвращает false, а не true. Вот мое заявление, еслиОбъект C# равен int не равен true

if (objectValue.Equals(intValue)) 
{ 
    return true; 
} 
return false; 

Мне нужно, чтобы бросить свою objectValue переменную в междунар, прежде чем сравнивать их?

+0

Что такое objectValue? –

+0

'((object) 3) .Equals (3)' возвращает 'true', поэтому у вас проблема в другом месте. – Luaan

+1

Кроме того: что такое 'objectValue.GetType(). FullName'; p –

ответ

4

С Equals - это виртуальный метод, который он назовет соответствующим методом подкласса object. В этом случае int.Equals. В очень простом примере:

object o = 4; 
int i = 4; 

o.Equals(i) возвращает true. Так что ваша проблема в другом месте. Возможно, objectValue не является int, но byte, short или другим цифровым типом.

+0

Спасибо, Джо, это правильно, в основном я обновил его, чтобы применить его к int, чтобы он работал нормально. – Canvas

-1

Да, вы должны бросить его

return ((int)objectValue).Equals(intValue); 

без актерского сравнения типа будет выполнена и объект никогда не равен к междунар, вот почему вы получите ложное значение.

+0

Nope. Равенство переопределяется в 'Integer'. – 2014-09-24 10:54:52

+0

http://msdn.microsoft.com/en-us/library/system.object.equals(v=vs.110).aspx, подумайте, что вы должны прочитать руководство, если object.equals (othertype) проверяет, чтобы увидеть если это тот же самый тип, в данном случае это не – Thorarins

+0

Я думаю, вы должны прочитать о виртуальных и переопределенных членах. Когда вы вызываете 'Equals' объекта, реальный тип которого является int,' Equals' из 'Integer' вызывается, но не из' Object' - из-за наследования и переопределения виртуального члена. – 2014-09-24 11:09:55

0

Проблема заключается не в том, что у объекта int в штучной упаковке - это прекрасно работает, так как вы можете легко попробовать себя.

Проблема возникает только в том случае, когда object фактически не содержит int, а отличается от другого числового типа, например. short или byte - в этом случае вы должны сначала удалить его соответствующим образом (например, (short)objectValue) и , затем сделать сравнение. Unboxing boxed short to int результатов в InvalidCastException - вы должны использовать точный тип со значениями.

Кроме того, обычно нет необходимости использовать Equals для этого - просто сделайте (int)objectValue == intValue или около того.

0
int val; 
if (int.TryParse(objectValue.ToString(), out val)) 
{ 
    if (val == intValue) 
    { 
     // return true; 
    } 
    else 
    { 
     //return false; 
    } 
} 
else 
{ 
    // value of obj is not int. you know here something is wrong 
} 

Использование TryParse() метода будет более безопасным вариантом, даже если у вас есть не значение INT в objectValue.

Смежные вопросы