Type Casting or Type Conversion is a mechanism to convert one data type value to another one. Type conversion is possible if both the data types are compatible to each other; otherwise you will get an InvalidCastException.
Implicit conversion is being done automatically by the compiler and no data will be lost. It includes conversion of a smaller data type to a larger data types and conversion of derived classes to base class. This is a safe type conversion.
int smallnum = 654667; // Implicit conversion long bigNum = smallnum;
class Base
{
public int num1 { get; set; }
}
class Derived : Base
{
public int num2 { get; set; }
}
class Program
{
static void Main(string[] args)
{
Derived d = new Derived();
//Implicit Conversion
Base b = d;
}
}
Explicit conversion is being done by using a cast operator. It includes conversion of larger data type to smaller data type and conversion of base class to derived classes. In this conversion information might be lost or conversion might not be succeed for some reasons. This is an un-safe type conversion.
long bigNum = 654667; // Explicit conversion int smallnum = (int)bigNum;
class Base
{
public int num1 { get; set; }
}
class Derived : Base
{
public int num2 { get; set; }
}
class Program
{
static void Main(string[] args)
{
Base b = new Base();
//Explicit Conversion
Derived d = (Derived)b;
}
}
User-defined conversion is performed by using special methods that you can define to enable explicit and implicit conversions. It includes conversion of class to struct or basic data type and struct to class or basic data type. Also, all conversions methods must be declared as static.
class RationalNumber
{
int numerator;
int denominator;
public RationalNumber(int num, int den)
{
numerator = num;
denominator = den;
}
public static implicit operator RationalNumber(int i)
{
// Rational Number equivalant of an int type has 1 as denominator
RationalNumber rationalnum = new RationalNumber(i, 1);
return rationalnum;
}
public static explicit operator float(RationalNumber r)
{
float result = ((float)r.numerator) / r.denominator;
return result;
}
}
class Program
{
static void Main(string[] args)
{
// Implicit Conversion from int to rational number
RationalNumber rational1 = 23;
//Explicit Conversion from rational number to float
RationalNumber rational2 = new RationalNumber(3, 2);
float d = (float)rational2;
}
}