For a value type such as int to be passed as an object it needs to be boxed, so a new object instance is created which stores the value 1, but this is done for both parameters so we end up with 2 new instances both holding the value 1.1 equals 1 for value types but the default comparison for System.Object is to compare references.