Type conversions differ slightly in C# as opposed to regular C++. Rajesh has put together an article to demonstrate the different types of conversions possible in the C# language.
Type conversion is a process of converting one type into another. Using C# type conversion techniques, not only you can convert data types, you can also convert object types. The type conversion in C# can be either implicit conversion or an explicit conversion.
If one type of data is automatically converted into another type of data, it is known as implicit conversions. There is no data loss due to implicit conversion. But explicit conversion is a forced conversion and there may be a data loss. Type conversions occur mainly when we pass arguments to a function or mixing mode arithmetic etc.
Implicit Conversions in C#
The implicit conversions can occur in a variety of situations like function invoking, cast expressions, assignments etc. The implicit conversions can be further classified into different categories.
Implicit Numerical Conversions
The possible implicit numerical conversions in C# are shown below.
- uint
- ulong
- float
- double
- decimal
- ushort
- short
- int
- long
- sbyte
- byte
- char

The implicit conversions in the direction of arrow are possible with basic data types of C#. Remember that there are no implicit conversions to the char type from any other types. Also there are no implicit or explicit conversions associated with bool type. The examples for implicit numerical conversions are shown below.
long x;
int y = 25;
x = y; //implicit numerical conversion
Implicit Enumeration Conversion
An implicit enumeration conversion permits the decimal integer literal 0 to be converted to any enum type.
Implicit Reference Conversion
The possible implicit reference conversions are:
- From any reference type to object.
- From any class type D to any class type B, provided D is inherited from B.
- From any class type A to interface type I, provided A implements I.
- From any interface type I2 to any other interface type I1, provided I2 inherits I1.
- From any array type to System.Array.
- From any array type A with element type a to an array type B with element type b provided A & B differ only in element type (but the same number of elements) and both a and b are reference types and an implicit reference conversion exists between a & b.
- From any delegate type to System.Delegate type.
- From any array type or delegate type to System.ICloneable
- From null type to any reference type.
Boxing Conversions
Boxing is the conversion of any value type to object type. Remember that boxing is an implicit conversion. Boxing a value of value type like int consists of allocating an object instance and copying the value of the value type into that object instance. An example for boxing is shown below.
int x = 10;
object o = x; //Boxing
if(o is int)
Console.WriteLine(“o contains int type”);
A boxing conversion making a copy of the value being boxed. But when we convert a reference type to object type, the object continues to reference the same instance.
Explicit Conversions in C#
The explicit conversions are forced conversions in C# by using the casting operator (). There may be a data loss due to explicit conversions. For example when we explicitly convert a double type to an int type as shown below
int x = (int) 26.45; //Explicit conversion
Console.WriteLine(x); // Displays only 26
Explicit Numerical Conversions
They are the conversions from a numeric type to another numeric type for which an implicit conversion doesn’t already exist. It is possible to convert any numerical type to any other numerical type explicitly. The explicit numerical conversions can result possibly a data loss or OverflowException to be thrown.
Explicit Enumeration Conversions
The explicit enumeration conversions are:
- From sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double or decimal to any enum type.
- From any enum type to sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double or decimal.
- From any enum type to any other enum type.
Explicit Reference Conversions
The possible explicit reference conversions are:
- From object to any reference type.
- From any class type B to any class type D, provided B is the base class of D
- From any class type A to any interface type I, provided S is not sealed and do not implement I.
- From any interface type I to any class type A, provided A is not sealed and implement I.
- From any interface type I2 to any interface type I1, provided I2 is not derived from I1.
- From System.Array to any array type.
- From System.Delegate type to any delegate type.
- From System.ICloneable to any array or delegate type.
Because of any reasons, if an explicit reference conversion fails, an InvalidCastException is thrown.
Un-boxing Conversions
Un-boxing is the conversion of an object type to a value type. The casting operator () is necessary for un-boxing. The example for un-boxing is shown below.
int x = 100;
object o = x; // Boxing
int I (int) o; // un-boxing
For an un-boxing conversion to a given value type to succeed at run-time , the value type of the source argument must be reference type to an object that was previously created by boxing a value of the value type. If the source argument is null or a reference type to an incompatible type, an InvalidCastException is thrown.
User-Defined Conversions
Whatever we explained till now is the conversions (implicit or explicit) among the basic data types or among same user defined data types. Suppose we have to do conversions between basic data types and user defined data types or between two incompatible user-efined data types. C# provides a facility to define conversion operators inside a class or struct to achieve this.
But C# provides only certain user-defined conversions to be defined. In particular it is not possible to redefine an existing implicit or explicit conversion in C#. A class or struct is permitted to declare a conversion function from a source type S to a target type T only if all of the following are true.
- Both S & T are different types.
- Either S or T is a class or struct type in which the operator declaration takes place.
- Neither S nor T is an object type or an interface type.
T is not a base class of S or S is not a base class of T. The user-defined conversion can either implicit or explicit. The general form of user-defined conversion operator is as follows.
public static implicit/explicit operator type (arguments)
{
}
Where the operator is the required keyword and type is the required return type. Remember that operator function should be public and static and there is no return type. The presence of the keyword explicit makes the conversion as explicit and implicit keyword makes the conversion as implicit.
The conversion operator can be defined either inside the class or struct type. Remember that user defined conversions are not allowed to convert from or to interface types. Also note that since explicit or implicit keywords are not part of the method’s signature, it is not possible to declare both explicit and implicit conversion operator with a same source and target type.
An example for a user-defined conversion is shown below.
// Conversions
// Author: rajeshvs@msn.com
using System;
class MyDigit
{
private int x;
public MyDigit ()
{
}
public MyDigit (int i)
{
x = i;
}
public void ShowDigit
{
Console.WriteLine("{0}",x);
}
public static implicit operator int(MyDigit md)
{
return md.x;
}
public static explicit operator MyDigit(int val)
{
return new MyDigit(val);
}
}
class MyClient
{
public static void Main()
{
MyDigit md1 = new MyDigit1(10);
int x = md1; //Implicit
Console.WriteLine(x); //Displays 10
int y = 25;
MyDigit md2 = (MyDigit)y; //Explicit
Console.WriteLine(md2.ShowDigit());
}
}
The above example converts a basic type to a class type and a class type to basic type by using the conversion operator. The conversion operator can be used to convert one class type to another also. An example is shown below.
// Conversions
// Author: rajeshvs@msn.com
using System;
class MyClass1
{
public int x;
public MyClass1(int a)
{
x = a;
}
public void Show1()
{
Console.WriteLine(x);
}
public static explicit operator MyClass2 (MyClass1 mc1)
{
MyClass2 mc2 = new MyClass2(mc1.x * 10, mc1.x *20);
return mc2;
}
}
class MyClass2
{
public float x, y;
public MyClass2(float a, float b)
{
x = a;
y = b;
}
public void Show2()
{
Console.WriteLine(x);
Console.WriteLine(y);
}
}
class MyClient
{
public static void Main()
{
MyClass1 mc1 = new MyClass1(100);
mc1.Show1();
MyClass2 mc2 = (MyClass2)mc1;
mc2.Show2();
}
}
If a user-defined conversion can give rise to exceptions or loss of information, then that conversion should be defined as an explicit conversion. In general user defined implicit conversions should be designed to never thrown exceptions and never loss information. Remember that user defined conversions can be either defined inside source class or inside a target class in the case of class-to-class conversions.
| DISCLAIMER: The content provided in this article is not warranted or guaranteed by Developer Shed, Inc. The content provided is intended for entertainment and/or educational purposes in order to introduce to the reader key ideas, concepts, and/or product reviews. As such it is incumbent upon the reader to employ real-world tactics for security and implementation of best practices. We are not liable for any negative consequences that may result from implementing any information covered in our articles or tutorials. If this is a hardware review, it is not recommended to open and/or modify your hardware. |
More C# Articles
More By Rajesh V S
developerWorks - FREE Tools! |
Poor Requirements Management capabilities in an Enterprise have been linked to excessive project failures, escalating IT costs, and failure to deliver competitive advantage into the marketplace. Join Brianna M Smith from IBM Rational and learn about how successful organizations align IT and Business stakeholders through collaborative processes and tools for effective requirements management, and how an integrated approach across the IT lifecycle can provide unparalleled visibility and traceability to ensure that project teams are delivering on the business vision by "doing the right things" and "doing things right." FREE! Go There Now!
|
|
|
|
Learn to enable users to both rate existing animations and to combine existing animations into new snippets. This is the third in a series of three tutorials that chronicle the building of a site that enables collaborative discussion and animation building using Domino and OpenLaszlo. FREE! Go There Now!
|
|
|
|
Learn how you can extend modern application lifecycle management to IBM System z through the IBM Rational Software Delivery Platform (SDP). The Did you say mainframe? e-kit includes podcasts, webcasts, tutorials, white and red papers, demos, and articles designed to help ease the challenges of modernizing your enterprise. This complimentary kit for mainframe developers is a practical, how-to guide for making the most of an existing development environment, including the skills and infrastructure already in place at an established enterprise. FREE! Go There Now!
|
|
|
|
Join this webcast to see how IBM Data Studio Developer and pureQuery can take the pain out of Java data access. uApplications developed using both Java and SQL have become a common requirement. Database connectivity using Java Database Connectivity (JDBC) to create an application is a multi-step tedious process, and tooling that covers both SQL and Java has been unavailable, until now. IBM Data Studio introduces the pureQuery platform: a high-performance, Java data access platform focused on simplifying the tasks of developing, managing, and optimizing database applications and services. FREE! Go There Now!
|
|
|
|
Join this Rational Talks to You teleconference on December 11 at 1:00 pm ET to get tips on building your own plugins with Rational Method Composer. Get your questions answered! FREE! Go There Now!
|
|
|
|
Because access to government information continues to be an area of concern for many U.S. citizens with disabilities, the U.S. government enacted Section 508 of the Rehabilitation Act in 2001 to ensure that government agencies create accessible Web content, enabling all citizens to access the information they need. A fully accessible Web site makes Web content accessible to all individuals, including those with disabilities, who may be accessing Web content via a variety of user agents. Common user agents include standard Web browsers, text-only browsers, assistive devices and mobile devices such as cell phones or personal digital assistants (PDAs). FREE! Go There Now!
|
|
|
|
Informix Dynamic Server (IDS) Express Edition offers outstanding online transaction processing (OLTP) database performance, while helping to simplify and automate many of the tasks associated with deploying databases for small business applications. IDS 11 further extends the ease of management and applications integration with the Admin API and Scheduler, high availability with Continuous Log Restore for backup server recovery in case of a primary server failure, and column level encryption to protect personal and company private data. FREE! Go There Now!
|
|
|
|
Join the IBM Watchfire team for an informative discussion on techniques and best practices to proactively manage Web application security and how to effectively build application security testing into the software development lifecycle (SDLC). In this Software Delivery Platform webcast you will learn: How to better understand potential web application security vulnerabilities, best practices and how to effectively integrate application security testing into the software development lifecycle, the importance of detecting and removing software vulnerabilities during application development. FREE! Go There Now!
|
|
|
|
WebSphere Process Server delivers a unique integration framework that simplifies existing IT resources. Often, as IT assets grow to support business demand, so too does their complexity and manageability. In this webcast, we’ll discuss how WebSphere Process Server helps deliver an SOA infrastructure that provides a common model to orchestrate, mediate, connect, map, and execute the underlying IT functions. Discover how WebSphere Process Server simplifies integration of business processes by leveraging existing IT assets as reusable services without the complexities of traditional integration methodologies. FREE! Go There Now!
|
|
|
|
Viper 2 brings a great value to developer communities including SQL, XML, PHP, Ruby, .NET and Java. You probably already know that DB2 Express-C is free for developers to develop, deploy and distribute. Viper 2 provides a variety of means that help move your application from the development stage to deployment more rapidly. This webcast shows how to best utilize the latest tools available for developing DB2 applications. FREE! Go There Now!
|
|
|
|
All FREE IBM® developerWorks Tools! |