Jon Jagger
jon@jaggersoft.com
Table of Contents 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Notes DownloadECMA-334 C# Language Specificationpreviousnextprevious at this levelnext at this level 11 Typesprevious at this levelnext at this level 11.3 Boxing and unboxingprevious at this levelnext at this level 11.3.1 Boxing conversions Paragraph 11 A boxing conversion permits any value-type to be implicitly converted to the type object or to any interface-type implemented by the value-type. 2 Boxing a value of a value-type consists of allocating an object instance and copying the value-type value into that instance. Paragraph 21 The actual process of boxing a value of a value-type is best explained by imagining the existence of a boxing class for that type. [Example: For any value-type T, the boxing class behaves as if it were declared as follows:
sealed class T_Box  
{  
   T value;  
   public T_Box(T t) {  
      value = t;  
   }  
}  
Boxing of a value v of type T now consists of executing the expression new T_Box(v), and returning the resulting instance as a value of type object. Thus, the statements
int i = 123;  
object box = i;  
conceptually correspond to
int i = 123;  
object box = new int_Box(i);  
end example]
Paragraph 31 Boxing classes like T_Box and int_Box above don't actually exist and the dynamic type of a boxed value isn't actually a class type. 2 Instead, a boxed value of type T has the dynamic type T, and a dynamic type check using the is operator can simply reference type T. [Example: For example,
int i = 123;  
object box = i;  
if (box is int) {  
   Console.Write("Box contains an int");  
}  
will output the string "Box contains an int" on the console. end example]
Paragraph 41 A boxing conversion implies making a copy of the value being boxed. 2 This is different from a conversion of a reference-type to type object, in which the value continues to reference the same instance and simply is regarded as the less derived type object. [Example: For example, given the declaration
struct Point  
{  
   public int x, y;  
   public Point(int x, int y) {  
      this.x = x;  
      this.y = y;  
   }  
}  
the following statements
Point p = new Point(10, 10);  
object box = p;  
p.x = 20;  
Console.Write(((Point)box).x);  
will output the value 10 on the console because the implicit boxing operation that occurs in the assignment of p to box causes the value of p to be copied. Had Point been declared a class instead, the value 20 would be output because p and box would reference the same instance. end example]
{ JSL }
Jagger Software Ltd
Company # 4070126
VAT # 762 5213 42
Valid HTML 4.01Valid CSS