@@ -146,10 +146,12 @@ private static object GenerateProcessArrayMethod(Type type, bool isDeep)
146146 else
147147 {
148148 // multidim or not zero-based arrays
149- var methodInfo = typeof ( ClonerToExprGenerator ) . GetPrivateStaticMethod (
150- rank == 2 && type == elementType . MakeArrayType ( )
151- ? "Clone2DimArrayInternal"
152- : "CloneAbstractArrayInternal" ) ;
149+ MethodInfo methodInfo ;
150+ if ( rank == 2 && type == elementType . MakeArrayType ( 2 ) )
151+ methodInfo = typeof ( ClonerToExprGenerator ) . GetPrivateStaticMethod ( "Clone2DimArrayInternal" ) . MakeGenericMethod ( elementType ) ;
152+ else
153+ methodInfo = typeof ( ClonerToExprGenerator ) . GetPrivateStaticMethod ( "CloneAbstractArrayInternal" ) ;
154+
153155 var callS = Expression . Call ( methodInfo , Expression . Convert ( from , type ) , Expression . Convert ( to , type ) , state , Expression . Constant ( isDeep ) ) ;
154156 return Expression . Lambda ( funcType , callS , from , to , state ) . Compile ( ) ;
155157 }
@@ -201,6 +203,10 @@ internal static T[] Clone1DimArrayClassInternal<T>(T[] objFrom, T[] objTo, DeepC
201203 {
202204 // not null from called method, but will check it anyway
203205 if ( objFrom == null || objTo == null ) return null ;
206+ if ( objFrom . GetLowerBound ( 0 ) != 0 || objFrom . GetLowerBound ( 1 ) != 0
207+ || objTo . GetLowerBound ( 0 ) != 0 || objTo . GetLowerBound ( 1 ) != 0 )
208+ return ( T [ , ] ) CloneAbstractArrayInternal ( objFrom , objTo , state , isDeep ) ;
209+
204210 var l1 = Math . Min ( objFrom . GetLength ( 0 ) , objTo . GetLength ( 0 ) ) ;
205211 var l2 = Math . Min ( objFrom . GetLength ( 1 ) , objTo . GetLength ( 1 ) ) ;
206212 state . AddKnownRef ( objFrom , objTo ) ;
@@ -212,13 +218,13 @@ internal static T[] Clone1DimArrayClassInternal<T>(T[] objFrom, T[] objTo, DeepC
212218 return objTo ;
213219 }
214220
215- if ( ! isDeep )
216- {
217- for ( var i = 0 ; i < l1 ; i ++ )
218- for ( var k = 0 ; k < l2 ; k ++ )
219- objTo [ i , k ] = objFrom [ i , k ] ;
220- return objTo ;
221- }
221+ if ( ! isDeep )
222+ {
223+ for ( var i = 0 ; i < l1 ; i ++ )
224+ for ( var k = 0 ; k < l2 ; k ++ )
225+ objTo [ i , k ] = objFrom [ i , k ] ;
226+ return objTo ;
227+ }
222228
223229 if ( typeof ( T ) . IsValueType ( ) )
224230 {
@@ -253,6 +259,11 @@ internal static Array CloneAbstractArrayInternal(Array objFrom, Array objTo, Dee
253259 var idxesTo = Enumerable . Range ( 0 , rank ) . Select ( objTo . GetLowerBound ) . ToArray ( ) ;
254260
255261 state . AddKnownRef ( objFrom , objTo ) ;
262+
263+ // unable to copy any element
264+ if ( lengths . Any ( x => x == 0 ) )
265+ return objTo ;
266+
256267 while ( true )
257268 {
258269 if ( isDeep )
0 commit comments