//Ví dụ minh họa nạp chồng toán tử (operator==, !=, + , - trong C# sử dụng implicit và explicit
using System;
public class Fraction{
public Fraction(int numerator, int denominator){
     Console.WriteLine("In Fraction Constructor(int, int)");
     this.numerator=numerator;
     this.denominator=denominator;
}
public Fraction(int wholeNumber){
     Console.WriteLine("In Fraction Constructor(int)");
     numerator = wholeNumber;
     denominator = 1;
}
public static implicit operator Fraction(int theInt){
     System.Console.WriteLine("In implicit conversion to Fraction");
     return new Fraction(theInt);
}
public static explicit operator int(Fraction theFraction){
     System.Console.WriteLine("In explicit conversion to int");
     return theFraction.numerator / theFraction.denominator;
}
public static bool operator==(Fraction lhs, Fraction rhs){
     Console.WriteLine("In operator ==");
     if (lhs.denominator == rhs.denominator &&
         lhs.numerator == rhs.numerator)
     {
        return true;
     }
     // code here to handle unlike fractions
     return false;
}
public static bool operator !=(Fraction lhs, Fraction rhs){
     Console.WriteLine("In operator !=");
     return !(lhs==rhs);
}
public override bool Equals(object o){
     Console.WriteLine("In method Equals");
     if (! (o is Fraction) ){
        return false;
     }
     return this == (Fraction) o;
}
public static Fraction operator+(Fraction lhs, Fraction rhs){
     Console.WriteLine("In operator+");
     if (lhs.denominator == rhs.denominator){
        return new Fraction(lhs.numerator+rhs.numerator,
         lhs.denominator);
     }
     // simplistic solution for unlike fractions
     // 1/2 + 3/4 == (1*4) + (3*2) / (2*4) == 10/8
     int firstProduct = lhs.numerator * rhs.denominator;
     int secondProduct = rhs.numerator * lhs.denominator;
     return new Fraction(
        firstProduct + secondProduct,
        lhs.denominator * rhs.denominator
        );
}
public override string ToString(){
     String s = numerator.ToString( ) + "/" +
        denominator.ToString( );
     return s;
}
private int numerator;
private int denominator;
}
public class Tester{
static void Main(){
     //implicit conversion to Fraction
     Fraction f1 = new Fraction(3);
     Console.WriteLine("f1: {0}", f1.ToString( ));
     Fraction f2 = new Fraction(2,4);
     Console.WriteLine("f2: {0}", f2.ToString( ));
     Fraction f3 = f1 + f2;
     Console.WriteLine("f1 + f2 = f3: {0}", f3.ToString());
     Fraction f4 = f3 + 5;
     Console.WriteLine("f3 + 5 = f4: {0}", f4.ToString());
     Fraction f5 = new Fraction(2,4);
     if (f5 == f2){
        Console.WriteLine("F5: {0} == F2: {1}", f5.ToString(),
       f2.ToString());
     }
     int k = (int)f4; //explicit conversion to int
     Console.WriteLine("int: F5 = {0}", k.ToString());
}
}