C# will convert (for example) an int to a long implicitly and will allow you to convert a long to an int explicitly. The conversion from int to long is implicit because you know that any int will fit into the memory representation of a long. The reverse operation, from long to int, must be explicit (using a cast) because it is possible to lose information in the conversion:
int myInt = 5; long myLong; myLong = myInt; // implicit myInt = (int) myLong; // explicit
You want to be able to convert your Fraction objects to intrinsic
types (e.g., int) and back. Given an int, you can support an implicit
conversion to a fraction because any whole value is equal to that
value over 1 (e.g.,
Given a fraction, you might want to provide an explicit conversion back to an integer, understanding that some value might be lost. Thus, you might convert 9/4 to the integer value 2 (truncating to the nearest whole number).
A more sophisticated Fraction class might not truncate, but rather round to the nearest whole number. This idea is left, as they say, as an exercise for the reader.
You use the keyword
implicit when the
conversion is guaranteed to succeed and no information will be lost;
otherwise you use
and explicit are actually operators, often called
cast or casting operators because
their job is to cast from one type to another (e.g., int to Fraction
or Fraction to int).
Example 12-3 illustrates how you might implement implicit and explicit ...