[Mono-bugs] [Bug 80299][Wis] New - Array.CopyTo/Array.Copy doesn't support Enum to underlying-type conversion

bugzilla-daemon at bugzilla.ximian.com bugzilla-daemon at bugzilla.ximian.com
Mon Dec 18 06:53:36 EST 2006


Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.

Changed by andyhume32 at yahoo.co.uk.

http://bugzilla.ximian.com/show_bug.cgi?id=80299

--- shadow/80299	2006-12-18 06:53:36.000000000 -0500
+++ shadow/80299.tmp.6698	2006-12-18 06:53:36.000000000 -0500
@@ -0,0 +1,73 @@
+Bug#: 80299
+Product: Mono: Class Libraries
+Version: 1.2
+OS: 
+OS Details: 
+Status: NEW   
+Resolution: 
+Severity: 
+Priority: Wishlist
+Component: CORLIB
+AssignedTo: mono-bugs at ximian.com                            
+ReportedBy: andyhume32 at yahoo.co.uk               
+QAContact: mono-bugs at ximian.com
+TargetMilestone: ---
+URL: 
+Cc: 
+Summary: Array.CopyTo/Array.Copy doesn't support Enum to underlying-type conversion
+
+In code developed on the MSFT CLR I have:
+
+    enum ObexHeaderId : byte { .... }
+and then
+
+    ObexHeaderId[] srcEnums = ...;
+    byte[] dstBytes = new byte[srcEnums.Length];
+    srcEnums.CopyTo(dstBytes, 0);
+
+That works on MSFT CLR (desktop v2), but fails on Mono at the 
+Array.CopyTo with:
+
+System.ArrayTypeMismatchException : (Types: 
+source=Brecham.Obex.ObexHeaderId;  target=System.Byte)
+  at System.Array.Copy (System.Array sourceArray, Int32 sourceIndex, 
+System.Array destinationArray, Int32 destinationIndex, Int32 length) 
+[0x00174] in C:\cygwin\tmp\scratch\mono-1.2.2.1
+\mcs\class\corlib\System\Array.cs:932
+  at System.Array.CopyTo (System.Array array, Int32 index) [0x00089] in 
+C:\cygwin\tmp\scratch\mono-1.2.2.1\mcs\class\corlib\System\Array.cs:1752
+  at Brecham.Obex.ObexClientSession.LogHeaderIds (System.String message, 
+Brecham.Obex.ObexHeaderId[] keys) [0x00000]
+  [...]
+
+It fails on the NETCFv2 with InvalidCastException, btw.
+
+
+A workaround is straightforward.  I've changed my code to use the 
+elements manually, but a for loop over the array casting the element on 
+copying, is of course straighforward.
+
+
+ECMA's Array.pdf in tr-084.zip says:
+"If sourceArray and destinationArray are of different types, 
+System.Array.Copy performs widening conversions on the elements [...]"
+and
+"If the necessary conversion is a narrowing conversion, a 
+System.ArrayTypeMismatchException exception is thrown. [Note: For 
+information regarding valid conversions performed by this method, see 
+System.Convert.]"
+
+There is hardly any text in the CopyTo method, so do we assume that text 
+applies to it too?
+
+I presume the necessary conversion here is not a "narrowing conversion", 
+and nor is it a "widening conversion".  So where does this case lie?
+
+Again MSDN seems not to cover this case.
+
+
+A set of test cases is included.  They show that copy only is successful 
+when the type of the destination array is the same as the 'underlying' 
+type of the enum.  For instance, counterintuitively, an array of 'byte' 
+enums fails to copy to an Int32 array.  This maybe suggests that this 
+behaviour on the MSFT CLR is just by side effect and not intentional...


More information about the mono-bugs mailing list