For people who are not familiar with Java: This is because the Integer class is a wrapper around the primitive "int" type. Makes sense that there is a cache of instances (rather references to them) when there should only be one instance per value. In C#, we don't have this problem since primitive types are first-class constructs that are treated like any other object. The keyword "int" corresponds to a System.Int32 which is derived from System.ValueType (special base class) that is treated as a value at the runtime. Copied when passed around. There might be other ways to fool the system through reflection.