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

David La Motta dlamotta@email.com
Fri, 17 Oct 2003 09:59:39 -0400


I like the == example better than the switch example--because that's 
what toString() is for ;-)

Thanks for the examples...

Implicit and explicit have become clearer in my mind, which is what the 
book I was reading didn't accomplish.

// David


Todd Berman wrote:

>Actually, I must say that I am glad the implicit/explicit operators are
>defined.
>
>For example, let's say you have a class that does a lot of stuff, but
>also contains a Uri. Now, it is nice to be able to say if(UriContainer
>== someUri) without having to worry about the casting.
>
>Or, for a real world example, take the WSE2 Addressing class Action. It
>is a class that represents an XmlElement (Note, this class does *not*
>inherit from an XmlElement at all). The InnerText of this xml element is
>a string that contains the 'action' of the Soap Addressing Header. With
>implicit operators it is possible to do this:
>
>	switch(ActionObject) {
>		case "urn:test:action1":
>			//Your code here.
>			break;
>		case "urn:test:action2":
>			//Your code here.
>			break;
>	}
>
>Admittedly, there are for sure other ways to accomplish the same goal,
>but none are nearly as readable as that.
>
>Now, the language could have been set up to just make all operators
>implicit, and again, I am glad they didn’t do that, because it allows me
>as a API programmer to construct my API in such a fashion that its
>somewhat self documenting to the end developer.
>
>--Todd
>
>-----Original Message-----
>From: mono-list-admin@lists.ximian.com
>[mailto:mono-list-admin@lists.ximian.com] On Behalf Of David La Motta
>Sent: October 17, 2003 9:23 AM
>To: Jonathan Pryor
>Cc: Mono-List
>Subject: Re: [Mono-list] implicit, explicit, and why does C# have these?
>
>Thanks for the explanation.  I can see how the implicit operator can be
>useful in the example you describe; still, I think it wasn't necessary
>for C# to expose them to us.  I.e., let us deal with the explicit casts
>and spare the confusion they may cause.  In other words, an implicit
>cast from a Pear object to a Truck object can seem quite odd, assuming
>their inheritance tree has nothing in common.
>
>// David
>
>Jonathan Pryor wrote:
>
>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
>    
>
>  
>
>  
>