为什么 Explicit(T 数组)在 Delphi 10 中收到垃圾?
Why does `Explicit(array of T)` receive garbage in Delphi 10?
我正在使用 Delphi 10 西雅图。
当我编译这个单元时(它只是一个空白的 vcl 项目,带有一个注册了 Button1Click
的按钮)它编译并运行但数据不符合预期。函数 Explicit
(覆盖显式转换)将接收 (6109508, -1, 3)
而不是 (1, 2, 3)
。为什么?
构造函数工作得很好,它有相同的参数声明。
当我使用调试器查看 data
时,它是 (1, 2, 3)
,但是当我进入 Explicit
并检查 Values
时,它是 (6109508, -1, 3)
。当 Values
不是 const
时也是如此。
我使用 TIntArray
只是为了表明这与 TGeneric<integer>
具有相同的结果。
我错过了什么?或者这是一个错误?
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TGeneric<T: record> = record
private
FData: array of T;
public
class operator Explicit(const Values: array of T): TGeneric<T>;
constructor Create(const Values: array of T);
end;
TIntArray = TGeneric<integer>;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
class operator TGeneric<T>.Explicit(const Values: array of T): TGeneric<T>;
begin
Result := TGeneric<T>.Create(Values);
end;
constructor TGeneric<T>.Create(const Values: array of T);
begin
SetLength(Self.FData, Length(Values));
Move(Values[0], Self.FData[0], Length(Values) * SizeOf(T));
end;
procedure TForm1.Button1Click(Sender: TObject);
var a : TIntArray;
const data : array of integer = [ 1,2,3 ];
begin
a := TGeneric<integer>.Create(data); // seems ok.
a := TIntArray.Create(data); // seems ok.
a := TGeneric<integer>(data); // sends garbage to Explicit.
a := TIntArray(data); // sends garbage to Explicit.
end;
end.
此问题已在 , was reported 中提出并在 Delphi 10.2
中修复
我正在使用 Delphi 10 西雅图。
当我编译这个单元时(它只是一个空白的 vcl 项目,带有一个注册了 Button1Click
的按钮)它编译并运行但数据不符合预期。函数 Explicit
(覆盖显式转换)将接收 (6109508, -1, 3)
而不是 (1, 2, 3)
。为什么?
构造函数工作得很好,它有相同的参数声明。
当我使用调试器查看 data
时,它是 (1, 2, 3)
,但是当我进入 Explicit
并检查 Values
时,它是 (6109508, -1, 3)
。当 Values
不是 const
时也是如此。
我使用 TIntArray
只是为了表明这与 TGeneric<integer>
具有相同的结果。
我错过了什么?或者这是一个错误?
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TGeneric<T: record> = record
private
FData: array of T;
public
class operator Explicit(const Values: array of T): TGeneric<T>;
constructor Create(const Values: array of T);
end;
TIntArray = TGeneric<integer>;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
class operator TGeneric<T>.Explicit(const Values: array of T): TGeneric<T>;
begin
Result := TGeneric<T>.Create(Values);
end;
constructor TGeneric<T>.Create(const Values: array of T);
begin
SetLength(Self.FData, Length(Values));
Move(Values[0], Self.FData[0], Length(Values) * SizeOf(T));
end;
procedure TForm1.Button1Click(Sender: TObject);
var a : TIntArray;
const data : array of integer = [ 1,2,3 ];
begin
a := TGeneric<integer>.Create(data); // seems ok.
a := TIntArray.Create(data); // seems ok.
a := TGeneric<integer>(data); // sends garbage to Explicit.
a := TIntArray(data); // sends garbage to Explicit.
end;
end.
此问题已在