[I'm not on the list, so please keep me cc'd if possible (though I will check the archives periodically). Thanks.]
Although this is a general C# issue, I'm posting to this list because I'm interested in insight from people who've actually implemented a VM and C# compiler. It seems to be an issue that is entirely un-addressed by C# and the CTS, and I was wondering if there was some implementation reason why. Background: I'm looking for the .NET equivalent of java's Integer, Boolean etc classes. That is, a reference type that holds a representation of a primitive type. Specifically, I need a type that I can declare a variable to that might hold either null or an int. I had assumed that C#'s clever boxing would make this extremely easy (by eliminating the need to say new Integer(i) and i.intValue() all over the place), but it appears not: in C# it seems that the System.Int32 type is a value type and hence cannot hold null at all. It also seems that although you can box it into a variable of type "object", there's no way to express the *type* of the object in C#. It's either an "int" which is primitive, or an "object" which carries no type information. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmxspec/html/vcManagedExtensionsSpec_5_2_1.asp (sorry if that wraps) says the following: --- Given argument type V, a __gc object of type "boxed V" is allocated on the common language runtime heap. --- This suggests that perhaps you might be able to write: int i = 10 object o = (object) i; boxed int bi = (boxed int) o; int j = bi; However, http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vclrfCSharpKeywords_PG.asp indicates that "boxed" is not a C# keyword. If this *were* possible, it would have the following advantages over all existing solutions: - Unlike "object", it could be cast to and from "int" without an explicit cast, and (if the implementation were smart) without a runtime typecheck. - Unlike "int" it could take the null value. - Unlike a user defined class, it could be used as an int in all situations where an int is required without any extra syntax. It also seems from the quote above that these "boxed" types are already implemented internally, just not accessible from the language. So my question is, does anyone know of a better way to express what I want to do? I'd like to be able, for example, to express a nullable integer database field as a single property. With "boxed int" it would be easy to do: boxed int MyField { get { ... } set { ... } } In Java I could do this by using "Integer". In order to avoid the painful explicit boxing conversions, I had to maintain three separate properties: getField() would return an int, getWrappedField() would return an Integer, and getHasField() returned a boolean indicating whether the field was non-null. This was, of course, a complete pain in the neck, but at least it worked. To do this in C# (without a "boxed int" type) it seems like I'd have to jump through the same hoops *and* define the Integer class equivalent myself (eg class Integer { public int value }). I'm wondering about writing to MS and asking for a "boxed" keyword in future versions of C#, but I'd like feedback from people who are familiar with the intimate details of how boxing is implemented. I'd also be interested to know how hard it would be to implement a "boxed" keyword in my copy of mcs, just to experiment with the idea and provide a proof of concept if I *do* submit the idea to MS. Thanks in advance for any help, and sorry for the partially off-topic question. Stuart. -- Stuart Ballard, Programmer NetReach - Internet Solutions (215) 283-2300, ext. 126 http://www.netreach.com/ _______________________________________________ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list
