/* Mastering Visual C# .NET by Jason Price, Mike Gunderloy Publisher: Sybex; ISBN: 0782129110 */ /* Example7_11.cs illustrates casting objects */ using System; // declare the MotorVehicle class (the base class) class MotorVehicle { public string model; public MotorVehicle(string model) { this.model = model; } public void Start() { Console.WriteLine(model + " started"); } } // declare the Car class class Car : MotorVehicle { public bool convertible; public Car(string model, bool convertible) : base(model) { this.convertible = convertible; } } // declare the Motorcycle class class Motorcycle : MotorVehicle { public bool sidecar; // define a constructor public Motorcycle(string model, bool sidecar) : base(model) { this.sidecar = sidecar; } public void PullWheelie() { Console.WriteLine(model + " pulling a wheelie!"); } } public class Example7_11 { public static void Main() { // create a Car object Car myCar = new Car("MR2", true); // cast myCar to MotorVehicle (upcast) MotorVehicle myMotorVehicle = (MotorVehicle) myCar; // myMotorVehicle only has a model field and Start() method // (no convertible field) Console.WriteLine("myMotorVehicle.model = " + myMotorVehicle.model); myMotorVehicle.Start(); // Console.WriteLine("myMotorVehicle.convertible = " + // myMotorVehicle.convertible); // create a Motorcycle object Motorcycle myMotorcycle = new Motorcycle("V-Rod", true); // cast myMotorcycle to MotorVehicle (upcast) MotorVehicle myMotorVehicle2 = (MotorVehicle) myMotorcycle; // myMotorVehicle only has a model field and Start() method // (no sidecar field or PullWheelie() method) Console.WriteLine("myMotorVehicle2.model = " + myMotorVehicle2.model); myMotorVehicle2.Start(); // Console.WriteLine("myMotorVehicle2.sidecar = " + // myMotorVehicle2.sidecar); // myMotorVehicle2.PullWheelie(); // cast myMotorVehicle2 to Motorcycle (downcast) Motorcycle myMotorcycle2 = (Motorcycle) myMotorVehicle2; // myMotorCycle2 has access to all members of the Motorcycle class Console.WriteLine("myMotorcycle2.model = " + myMotorcycle2.model); Console.WriteLine("myMotorcycle2.sidecar = " + myMotorcycle2.sidecar); myMotorcycle2.Start(); myMotorcycle2.PullWheelie(); // cannot cast a Motorcyle object to the Car class because // their classes are not compatible // Car myCar2 = (Car) myMotorVehicle2; } }
Month: February 2011
Use an explicit conversion
/* C#: The Complete Reference by Herbert Schildt Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852 */ // Use an explicit conversion. using System; // A three-dimensional coordinate class. class ThreeD { int x, y, z; // 3-D coordinates public ThreeD() { x = y = z = 0; } public ThreeD(int i, int j, int k) { x = i; y = j; z = k; } // Overload binary +. public static ThreeD operator +(ThreeD op1, ThreeD op2) { ThreeD result = new ThreeD(); result.x = op1.x + op2.x; result.y = op1.y + op2.y; result.z = op1.z + op2.z; return result; } // This is now explicit. public static explicit operator int(ThreeD op1) { return op1.x * op1.y * op1.z; } // Show X, Y, Z coordinates. public void show() { Console.WriteLine(x + ", " + y + ", " + z); } } public class ThreeDDemo7 { public static void Main() { ThreeD a = new ThreeD(1, 2, 3); ThreeD b = new ThreeD(10, 10, 10); ThreeD c = new ThreeD(); int i; Console.Write("Here is a: "); a.show(); Console.WriteLine(); Console.Write("Here is b: "); b.show(); Console.WriteLine(); c = a + b; // add a and b together Console.Write("Result of a + b: "); c.show(); Console.WriteLine(); i = (int) a; // explicitly convert to int -- cast required Console.WriteLine("Result of i = a: " + i); Console.WriteLine(); i = (int)a * 2 - (int)b; // casts required Console.WriteLine("result of a * 2 - b: " + i); } }
An example that uses an implicit conversion operator
/* C#: The Complete Reference by Herbert Schildt Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852 */ // An example that uses an implicit conversion operator. using System; // A three-dimensional coordinate class. class ThreeD { int x, y, z; // 3-D coordinates public ThreeD() { x = y = z = 0; } public ThreeD(int i, int j, int k) { x = i; y = j; z = k; } // Overload binary +. public static ThreeD operator +(ThreeD op1, ThreeD op2) { ThreeD result = new ThreeD(); result.x = op1.x + op2.x; result.y = op1.y + op2.y; result.z = op1.z + op2.z; return result; } // An implicit conversion from ThreeD to int. public static implicit operator int(ThreeD op1) { return op1.x * op1.y * op1.z; } // Show X, Y, Z coordinates. public void show() { Console.WriteLine(x + ", " + y + ", " + z); } } public class ThreeDDemo5 { public static void Main() { ThreeD a = new ThreeD(1, 2, 3); ThreeD b = new ThreeD(10, 10, 10); ThreeD c = new ThreeD(); int i; Console.Write("Here is a: "); a.show(); Console.WriteLine(); Console.Write("Here is b: "); b.show(); Console.WriteLine(); c = a + b; // add a and b together Console.Write("Result of a + b: "); c.show(); Console.WriteLine(); i = a; // convert to int Console.WriteLine("Result of i = a: " + i); Console.WriteLine(); i = a * 2 - b; // convert to int Console.WriteLine("result of a * 2 - b: " + i); } }
explicit cast
using System; class ExplicitConv { static void Main() { double a = 5.654321; int b; b = (int)a; Console.WriteLine("The value is {0}", b); } }
Implicit cast
using System; class ImplicitConversion { public static void Main() { byte a = 1; int b = 1234; int c = a; //Implicit cast double d = b; //Implicit cast Console.WriteLine("{0}", c); Console.WriteLine("{0}", d); } }
Any object, value, or reference type that is convertible to an integral, char, enum, or string type is acceptable as the switch_expression
using System; class Employee { public Employee(string f_Emplid) { m_Emplid = f_Emplid; } static public implicit operator string(Employee f_this) { return f_this.m_Emplid; } private string m_Emplid; } class Starter { static void Main() { Employee newempl = new Employee("1234"); switch (newempl) { case "1234": Console.WriteLine("Employee 1234"); return; case "5678": Console.WriteLine("Employee 5678"); return; default: Console.WriteLine("Invalid employee"); return; } } }
Conversions between Simple Types
using System; public class MainClass { public static void Main() { double d = 2.9; Console.WriteLine((int)d); // double-->int; prints 2 Console.WriteLine((int)(-d)); // double-->int; prints -2 uint seconds = (uint)(24 * 60 * 60); // int-->uint double avgSecPerYear = 365.25 * seconds; // I uint-->double float f = seconds; // IL uint-->float long nationalDebt1 = 99999999999999; double perSecond = 99999.14; decimal perDay = seconds * (decimal)perSecond; // I uint-->decimal double nd2 = nationalDebt1 + (double)perDay; // decimal-->double long nd3 = (long)nd2; // double-->long float nd4 = (float)nd2; // double-->float } }