Explicit provides conversion functionality. An explicit conversion involves casting from one type to another.
With the explicit keyword, we implement the casting functionality as an operator method. This keyword (along with implicit) is used in operator overloading.
This program shows 2 classes. Each provides a public static
explicit operator: the Apartment provides a House operator, and the House provides an Apartment operator.
using System; class Apartment { public string Name { get; set; } public static explicit operator House(Apartment a) { return new House() { Name = a.Name }; } } class House { public string Name { get; set; } public static explicit operator Apartment(House h) { return new Apartment() { Name = h.Name }; } } class Program { static void Main() { House h = new House(); h.Name = "Broadway"; // Cast a House to an Apartment. Apartment a = (Apartment)h; // Apartment was converted from House. Console.WriteLine(a.Name); } }Broadway
With implicit, we allow a conversion from one class
to another without any syntax. It is possible to assign one class
instance to another. No cast expressions are needed.
static
method that returns the type you want to convert to and accepts the type you are converting from.class
and a Widget class
. Both classes have implicit conversion operators.using System; class Machine { public int _value; public static implicit operator Widget(Machine m) { Widget w = new Widget(); w._value = m._value * 2; return w; } } class Widget { public int _value; public static implicit operator Machine(Widget w) { Machine m = new Machine(); m._value = w._value / 2; return m; } } class Program { static void Main() { Machine m = new Machine(); m._value = 5; Console.WriteLine(m._value); // Implicit conversion from machine to widget. Widget w = m; Console.WriteLine(w._value); // Implicit conversion from widget to machine. Machine m2 = w; Console.WriteLine(m2._value); } }5 10 5
What is the point of explicit? It provides a special syntax form for converting types. This can be more intuitive for certain operations, mainly ones that involve numeric types.
You should only use the implicit operator if you are developing a commonly used type. It is probably most useful for the .NET Framework itself.
As with implicit, the explicit keyword is used to implement conversions. You should be careful with implementing conversions so that they are reversible and make sense.