Even the simple value types like int in C# can be thought of as objects. In fact, there are formal terms for the conversion of value types into reference types (that is, objects) and back again boxing and unboxing . Boxing a value type is the conversion of that value type into the type object . Boxing is implicit, which means the compiler will do it for you. For example, say you pass an integer to WriteLine in this code, where temperature is an int variable: System.Console.WriteLine("The temperature is {0}", temperature); In the case where you use a format string with WriteLine , WriteLine is actually expecting you to pass an object after the format string. When you pass an int , C# will box it into an object, and call that object's ToString method. Whereas boxing is implicit, unboxing the process of converting from an object back to a simple typemust be explicit, using a type cast. You can see an example of both boxing (implicit) and unboxing (explicit) in ch04_07.cs, Listing 4.7. Listing 4.7 Boxing and Unboxing (ch04_07.cs)public class ch04_07 { static void Main() { int int1 = 1; object obj1 = int1; //Boxing int int2 = (int) obj1; //Unboxing } } You can see the boxing and unboxing taking place in the MSIL for the Main method in ch04_07.cs: .entrypoint // Code size 18 (0x12) .maxstack 1 .locals init (int32 V_0, object V_1, int32 V_2) IL_0000: ldc.i4.1 IL_0001: stloc.0 IL_0002: ldloc.0 IL_0003: box [mscorlib]System.Int32 IL_0008: stloc.1 IL_0009: ldloc.1 IL_000a: unbox [mscorlib]System.Int32 IL_000f: ldind.i4 IL_0010: stloc.2 IL_0011: ret |