[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