Код в вашем вопросе компилировался в более старых версиях, но этого не должно было быть.Поведение в версии 10.2 является правильным.
То, что происходит в старых версиях, очень странно.Компилятор выбирает эту перегрузку в TStream
:
function Write(const Buffer: TBytes; Count: Longint): Longint; overload;
Это особенно вопиюще, поскольку в этот метод передан адрес статического массива CFourBytes
.Который категорически не является TBytes
объектом.
Теперь просто так получается, что переменная TBytes
является адресом первого элемента массива.И ничто в переопределении TBytes
для TMemoryStream.Write
не относится к Length()
этого поддельного TBytes
объекта.Таким образом, ваш код работает так, как задумано.Совершенно очевидно, что эта ошибка компилятора была исправлена.
Ваш код всегда был взломан, вы до сих пор просто удалялись от него по случайности.Вы должны исправить свой код.Например:
LStream := TMemoryStream.Create;
try
LStream.WriteBuffer(CFourBytes, SizeOf(CFourBytes));
SetLength(LBuffer, LStream.Size);
LStream.Position := 0;
LStream.ReadBuffer(LBuffer[0], LStream.Size);
finally
LStream.Free;
end;
Обратите внимание, что я использую WriteBuffer
и ReadBuffer
вместо Write
и Read
.Это предпочтительные методы для использования с TStream
.Причина в том, что они выполняют проверку ошибок и выдают исключения в случае ошибок, в отличие от Write
и Read
.