【发布时间】:2017-08-25 09:42:05
【问题描述】:
我做了一个非常简单的应用程序,但我遇到了一个我真的无法理解的问题。看看这个基本代码:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, generics.collections, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
test: TList<integer>;
aList: TList<integer>;
public
{ Public declarations }
function testGenerics: TList<integer>;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
test := testGenerics;
test.Sort;
showmessage(test[0].tostring);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
test := TList<integer>.Create;
aList := TList<integer>.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
aList.Free;
test.Free;
end;
function TForm1.testGenerics: TList<integer>;
begin
aList.Add(4);
result := aList;
end;
end.
基本上,当表单打开时,我将创建test 和aList,然后当我按下按钮时,函数testGenerics 被调用。为什么会出现Invalid pointer operation错误?
我真的无法理解,因为我正在正确地创建和销毁对象(我猜)。这段代码可以正常工作:
function TForm1.testGenerics: TList<integer>;
begin
Result := TList<integer>.Create;
Result.Add(4);
end;
在这种情况下,我将返回 TList<integer> 的实例,但在上述情况下,我将返回 aList 的实例(这是一个 TList)。
如果我在第一种情况下是正确的,test := testGenerics 就像 test := aList(因为我实际上返回的是 aList)所以我将给 test 与 aList 相同的引用。我对么?
【问题讨论】:
标签: delphi