# Array.ConstrainedCopy(Array, Int32, Array, Int32, Int32) Method

## Definition

```
public:
static void ConstrainedCopy(Array ^ sourceArray, int sourceIndex, Array ^ destinationArray, int destinationIndex, int length);
```

`public static void ConstrainedCopy (Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length);`

`static member ConstrainedCopy : Array * int * Array * int * int -> unit`

`Public Shared Sub ConstrainedCopy (sourceArray As Array, sourceIndex As Integer, destinationArray As Array, destinationIndex As Integer, length As Integer)`

#### Parameters

- sourceIndex
- Int32

A 32-bit integer that represents the index in the `sourceArray`

at which copying begins.

- destinationIndex
- Int32

A 32-bit integer that represents the index in the `destinationArray`

at which storing begins.

- length
- Int32

A 32-bit integer that represents the number of elements to copy.

#### Exceptions

`sourceArray`

and `destinationArray`

have different ranks.

The `sourceArray`

type is neither the same as nor derived from the `destinationArray`

type.

At least one element in `sourceArray`

cannot be cast to the type of `destinationArray`

.

`sourceIndex`

is less than the lower bound of the first dimension of `sourceArray`

.

-or-

`destinationIndex`

is less than the lower bound of the first dimension of `destinationArray`

.

-or-

`length`

is less than zero.

`length`

is greater than the number of elements from `sourceIndex`

to the end of `sourceArray`

.

-or-

`length`

is greater than the number of elements from `destinationIndex`

to the end of `destinationArray`

.

## Remarks

The `sourceArray`

and `destinationArray`

parameters must have the same number of dimensions. The `sourceArray`

type must be the same as or derived from the `destinationArray`

type; otherwise, an ArrayTypeMismatchException is thrown. Unlike Copy, ConstrainedCopy verifies the compatibility of the array types before performing any operation.

When copying between multidimensional arrays, the array behaves like a long one-dimensional array, where the rows (or columns) are conceptually laid end-to-end. For example, if an array has three rows (or columns) with four elements each, copying six elements from the beginning of the array would copy all four elements of the first row (or column) and the first two elements of the second row (or column). To start copying from the second element of the third row (or column), `sourceIndex`

must be the upper bound of the first row (or column) plus the length of the second row (or column) plus two.

If `sourceArray`

and `destinationArray`

overlap, this method behaves as if the original values of `sourceArray`

were preserved in a temporary location before `destinationArray`

is overwritten.

[C++]

This method is equivalent to the standard C/C++ function `memmove`

, not `memcpy`

.

The arrays can be reference-type arrays or value-type arrays. If `sourceArray`

and `destinationArray`

are both reference-type arrays or are both arrays of type Object, a shallow copy is performed. A shallow copy of an Array is a new Array containing references to the same elements as the original Array. The elements themselves or anything referenced by the elements are not copied. In contrast, a deep copy of an Array copies the elements and everything directly or indirectly referenced by the elements.

If this method throws an exception while copying, the `destinationArray`

remains unchanged; therefore, ConstrainedCopy can be used within a constrained execution region (Cer).

This method is an O(`n`

) operation, where `n`

is `length`

.