Оператор ==
является статическим, а не виртуальным, поэтому поведение определяется статическим типом, а не типом времени выполнения. Реализация по умолчанию для ==
на объектах ссылочного типа заключается в сравнении ссылок (хотя типы могут реализовывать другое поведение, например string
). У вас есть два разных объекта, и они не имеют одинаковую ссылку, поэтому ==
возвращает false.
Решение, как вы указываете, заключается в использовании Equals. Равный это виртуальный метод. Поскольку value1
имеет тип времени выполнения Int32
, вы в конечном итоге вызовете Int32.Equals . Из .NET Reflector вы можете видеть, что это выглядит следующим образом:
public override bool Equals(object obj)
{
return ((obj is int) && (this == ((int) obj)));
}
Другими словами, он проверяет, имеет ли аргумент тип int
, и, если это так, преобразует его и использует ==
, определенный для int
. Это сравнивает значения целых чисел.
Единственный способ исправить это - использовать метод .Equals ()?
Альтернативой является приведение ваших объектов к int
и затем использование ==
, как это делает реализация Int32.Equals
.