[Mono-list] implicit, explicit, and why does C# have these?

Jonathan Pryor jonpryor@vt.edu
Thu, 16 Oct 2003 18:13:33 -0400


It's good to keep this in mind: C#'s "builtin" types (int, long, etc.)
are actually aliases for managed types (System.Int32, System.Int64,
etc.).  These managed types are (for Mono, at least) written in C#.

You expect the following code to work:

	int n = 42;
	long l = n;
	short s = (short) n;

Which means that the following code also works:

	System.Int32 n = 42;
	System.Int64 l = n;
	System.Int16 s = (System.Int16) n;

Which means that the managed implementation of those managed types needs
*some way* to represent to the compiler/runtime that some coercions are
"safe" (can be done implicitly), while others are "unsafe" (can be done
explicitly).

C#'s implicit/explicit operators are how this is declared and defined.

As for the differences between implicit & explicit, you understand the
difference already.  Implicit == doesn't need a cast; explicit ==
requires a cast.

 - Jon

On Thu, 2003-10-16 at 16:52, David La Motta wrote:
> So I was reading my "C# for Java Developers" book and I came across the 
> implicit and explicit operators.  Java doesn't have these but a friend 
> suggests C++ does.  Being that I am not a C++ developer I really can't 
> comment much on it, except to say that it looks like C# just decided to 
> copy functionality from C++, just because it is a "cute" feature of the 
> language.  I also can't quite put my finger on the difference between 
> implicit and explicit, so if anybody has any insight on these, please, 
> do share.
> 
> It seems to me that explicit is used when you want to force your API 
> clients to use a cast when dealing with different types.  So lets say 
> that I have:
> 
> public static implicit operator Foo(Bar bar) {...}    and I also have a 
> method called
> public Foo morph(Foo foo) {...}
> 
> If I was ever to use my morph method with a Bar, I could issue the call 
> like:
> 
> Bar bee = new Bee();
> Foo faa = morph(bee);
> 
> And the compiler would be happy.  If I was to change implicit for 
> explicit in the operator's declaration, the way of calling the method 
> would be:
> 
> Foo faa = morph((Foo) bee);   // with explicit cast
> 
> Is this it, or is there more to it than this?  I also am aware that this 
> isn't really a "mono" question per se, but I thought some of you would 
> be willing to shed some light on the topic...  :-)
> 
> Thanks!
> 
> // David
> 
> _______________________________________________
> Mono-list maillist  -  Mono-list@lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list