Dos de esos tipos son similares (idénticos de hecho). El tercero no es.
tarray se declara como "Matriz de Byte", como es TBytes. Sin embargo, omitió otro tipo muy relevante, TByteArray (el tipo al que hace referencia PByteArray).
ser un puntero a TByteArray, PByteArray es estrictamente hablando un puntero a una matriz de bytes estática, no una matriz dinámica (que los otros tipos de matrices de bytes son todos). Se escribe de esta manera para permitir la referencia a las compensaciones de ese puntero base usando un índice entero. Y tenga en cuenta que esta indexación está limitada a 2^15 elementos (0..32767). Para desplazamientos arbitrarios de bytes (> 32767) de algunos puntero base, un PByteArray no es bueno:
var
b: Byte;
ab: TArray<Byte>;
pba: PByteArray;
begin
SetLength(ab, 100000);
pba := @ab; // << No cast necessary - the compiler knows (magic!)
b := pba[62767]; // << COMPILE ERROR!
end;
es decir, que emiten un Matriz de Byte o una tarray a un PByteArray es potencialmente va a llevar a problemas donde la matriz tiene> 32K elementos (y el puntero se pasa a un código que intenta acceder a todos los elementos). Casting a un puntero sin tipo lo evita por supuesto (siempre que el "destinatario" del puntero maneje el acceso a la referencia de memoria por el puntero apropiadamente).
PERO, nada de esto es probable que cambie en el futuro, es simplemente una consecuencia de los detalles de implementación que desde hace tiempo se aplican en esta área.La introducción de una declaración de tipo genérica azucarada sintácticamente es kipper rouge.
En realidad, está equivocado ... una "Matriz de byte" no es una matriz de bytes ... Es un puntero a una matriz dinámica de bytes que es referencia contada y longitud manejada (casi como cadenas). Lo que quiero saber es: ¿Esto es tan seguro para el tipo TBytes (o TArray) a PByteArray como para encasillar Cadena a PChar en lo que concierne a la compatibilidad con versiones anteriores? –
Una "matriz de bytes" ** es ** una matriz de bytes. La única diferencia es que se muestra al entorno de ejecución principalmente como * tipo de referencia *, en lugar de * tipo de valor * (como en el caso de una matriz estática). El compilador lo sabe, por supuesto, y (de acuerdo, debería) encargarse del encasillado para usted de la misma manera que lo hace con String <> PChar (a menudo denominado "compilación mágica", es decir, generación de código que depende del compilador). siendo consciente de sus propios internos). – Deltics
@Ken: Bien, entiendo a qué te refieres. Editando mi respuesta –