Csharp/CSharp Tutorial/Operator Overload/Cast operator
explicit/implicit operator for Complex
<source lang="csharp">using System; public struct Complex {
public Complex( double real, double imaginary ) { this.real = real; this.imaginary = imaginary; } // System.Object override public override string ToString() { return String.Format( "({0}, {1})", real, imaginary ); } public double Magnitude { get { return Math.Sqrt( Math.Pow(this.real, 2) + Math.Pow(this.imaginary, 2) ); } } public static implicit operator Complex( double d ) { return new Complex( d, 0 ); } public static explicit operator double( Complex c ) { return c.Magnitude; } private double real; private double imaginary;
} public class EntryPoint {
static void Main() { Complex cpx1 = new Complex( 1.0, 3.0 ); Complex cpx2 = 2.0; // Use implicit operator. double d = (double) cpx1; // Use explicit operator. Console.WriteLine( "cpx1 = {0}", cpx1 ); Console.WriteLine( "cpx2 = {0}", cpx2 ); Console.WriteLine( "d = {0}", d ); }
}</source>
cpx1 = (1, 3) cpx2 = (2, 0) d = 3.16227766016838
implicit and explicit operator cast
<source lang="csharp">using System;
class MyType { int value; public MyType( int b ) { value = b; } public static implicit operator int( MyType a ) { return a.value; } public static explicit operator string( MyType a ) { return "$" + a.value; } static void Main(string[] args) { MyType bal = new MyType( 777 ); Console.WriteLine("since int conversion is implicit we can write"); int i = bal; Console.WriteLine("string conveersion must be explicitly requested"); string str = (string)bal; // this causes a compilation error // str = bal; System.Console.WriteLine( "i = {0} \nstr = {1}", i, str ); } }</source>
since int conversion is implicit we can write string conveersion must be explicitly requested i = 777 str = $777