De hecho, es un error de montaje. x64, .net 4.7.1, versión de versión.
desmontaje:
for(int i = 0; i < N - Old.Length; i++)
00007FF942690ADD xor eax,eax
for(int i = 0; i < N - Old.Length; i++)
00007FF942690ADF mov ebx,esi
00007FF942690AE1 sub ebx,ebp
00007FF942690AE3 test ebx,ebx
00007FF942690AE5 jle 00007FF942690AFF
dd[i] = d;
00007FF942690AE7 mov rdx,qword ptr [rdi]
00007FF942690AEA cmp eax,dword ptr [rdx+8]
00007FF942690AED jae 00007FF942690B11
00007FF942690AEF movsxd rcx,eax
00007FF942690AF2 vmovsd qword ptr [rdx+rcx*8+10h],xmm6
for(int i = 0; i < N - Old.Length; i++)
00007FF942690AF9 inc eax
00007FF942690AFB cmp ebx,eax
00007FF942690AFD jg 00007FF942690AE7
00007FF942690AFF vmovaps xmm6,xmmword ptr [rsp+20h]
00007FF942690B06 add rsp,30h
00007FF942690B0A pop rbx
00007FF942690B0B pop rbp
00007FF942690B0C pop rsi
00007FF942690B0D pop rdi
00007FF942690B0E pop r14
00007FF942690B10 ret
El problema está en la dirección 00007FF942690AFD, el jg 00007FF942690AE7. Salta hacia atrás si ebx (que contiene 4, el valor final del ciclo) es mayor (jg) que eax, el valor i. Esto falla cuando es 4, por supuesto, por lo que no escribe el último elemento de la matriz.
Falla, porque incluye el valor de registro i (eax, en 0x00007FF942690AF9), y luego lo verifica con 4, pero aún tiene que escribir ese valor. Es un poco difícil precisar dónde se encuentra exactamente el problema, ya que parece que podría ser el resultado de la optimización de (N-Old.Length), ya que la compilación de depuración contiene ese código, pero la compilación de la versión lo calcula previamente. Entonces eso es para que la gente jit lo arregle