Boxing is the process of converting a value type into a managed heap object, which is implicit. Unboxing is the reverse process, for which the compiler requires an explicit cast. Since boxing stores the data type, why can't unboxing use that instead of asking for an explicit cast?
class BoxUnBox
{
static void Main()
{
int i = 123; // a value type
object o = i; // boxing
int j = (int)o; // unboxing - Why is an explicit cast required?
}
}
Boxing is implicit; unboxing is explicit. The concept of boxing and unboxing underlies the C# unified view of the type system in which a value of any type can be treated as an object.
Boxing and unboxing enables a unified view of the type system wherein a value of any type can ultimately be treated as an object. With Boxing and unboxing one can link between value-types and reference-types by allowing any value of a value-type to be converted to and from type object.
Boxing and unboxing are important concepts in C#. The C# Type System contains three data types: Value Types (int, char, etc), Reference Types (object) and Pointer Types. Basically, Boxing converts a Value Type variable into a Reference Type variable, and Unboxing achieves the vice-versa.
Boxing and Unboxing enables a unified view of the type system in which a value of any type can be treated as an object. It convert value type into an object type. It convert an object type into value type. Boxing is an implicit conversion process.
Your question is not related to unboxing operation only. Actually it should sound as "Why should I use explicit conversion?" Consider following example:
int i = 123;
long l = i;
int j = (int)l; // OMG why??
The answer is simple and you can find it in C# specification 6.2 Explicit conversions:
The explicit conversions are conversions that cannot be proven to always succeed, conversions that are known to possibly lose information, and conversions across domains of types sufficiently different to merit explicit notation.
In example above you might lose information, because long
can hold values which do not fit int
range. But you will never lose information when assigning int
to long
:
long l = i; // safe
In your example you need explicit conversion because implicit conversion cannot be proven to always succeed. Variables of object
type can reference
literally any type. What about string?
object o = i; // implicit and always safe
o = "Now I have a machinegun ho-ho-ho"; // safe too
int j = o; // will not succeed if o is string
Analogy
Object variable is like a black box where you can put anything - music CD, pen, phone or banana. Not only you, but anyone can put something there. If the last thing which you put in a black box in the morning was a banana, can you come back in the evening and eat whatever you pull out from the black box? If you live alone, and room is closed, and your memory is excellent, and... then you can. And you will wonder why everybody checks their box's content before eating it. But if you are not live alone, or the room is not closed, or you can forget just once that you have put the phone into the box... Bon appetite
What if someone changes the content of o
to say "Hello World"
. To be sure you know what you're doing, the compiler requires you to explicitly cast the boxed value.
Basically an implicit conversion implies that any instance o
, of type object, can also be represented as an instance of int
which clearly isn't the case. Consider for example this:
int i = -1;
long j = i;
It is clear that your variable i
, which is an integer, can also be considered as long
. This is why implicit casting is accurate here. On the other side, not every long
is also convertable to int
without any loss of data. Thus you need an explicit cast to determine: I know there might be some loss of data, however I don't care about it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With