Array.Copyメソッドでは、複写先を複写元と同一の配列にすることが出来ます。 この際、複写先と複写元の一部が重なっていても問題なく複写されます。

Array.Copyメソッドで配列自身へ複写する
using System;

class Sample {
  static void Main()
  {
    // 複写元の配列
    int[] arr = {0, 1, 2, 3, 4};

    // arrの部分配列(インデックス0から3個分)をarr自身のインデックス2以降にコピー
    Array.Copy(arr, 0, arr, 2, 3);

    foreach (var elem in arr) {
      Console.Write("{0}, ", elem);
    }
    Console.WriteLine();
  }
}
実行結果
0, 1, 0, 1, 2, 

このように、Array.Copyメソッドはmemcpyではなくmemmoveに相当する動作となります。