//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
//
using System;

namespace Testing
{
	struct Complex
	{
		double real;
		double imag;
		public Complex(double real, double imag)
		{
			this.real = real;
			this.imag = imag;
		}
		public override string ToString()
		{
			return (string.Format("({0}, {1}i)", real, imag));
		}
		public static explicit operator Complex(double r)
		{
			return new Complex(r, 0);
		}
		public static implicit operator Complex(double [] n)
		{
			if(n.Length != 2)
				throw new ArgumentException();
			return new Complex(n[0], n[1]);
		}
	}
	
	class ExplicitMain
	{
		static void Main(string[] args)
		{
			Complex cn = new Complex(1,0);
			Console.WriteLine("{0}", cn);
			cn = (Complex)2;
			Console.WriteLine("{0}", cn);
			double [] da = new double [] {3,0};
			cn = da;
			Console.WriteLine("{0}", cn);
		}
	}
}
