【发布时间】:2011-08-17 05:44:39
【问题描述】:
我有这个尖峰来测试 TPair。您可以在新的 Delphi XE 控制台应用程序上复制+粘贴。我已经标记了例外的行:
Project Project1.exe 引发异常 带有消息的 EAccessViolation 类 '地址0045042D的访问冲突 在模块“Project1.exe”中。阅读 地址 A9032D0C。
有什么想法吗?
谢谢。
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
Generics.Defaults,
Generics.Collections;
type
TProduct = class
private
FName: string;
procedure SetName(const Value: string);
published
public
property Name: string read FName write SetName;
end;
type
TListOfProducts = TObjectDictionary<TProduct, Integer>;
{ TProduct }
procedure TProduct.SetName(const Value: string);
begin
FName := Value;
end;
var
MyDict: TListOfProducts;
MyProduct1: TProduct;
MyProduct2: TProduct;
MyProduct3: TProduct;
APair: TPair<TProduct, Integer>;
aKey: string;
begin
try
MyDict := TListOfProducts.Create([doOwnsKeys]);
MyProduct1 := TProduct.Create;
MyProduct1.Name := 'P1';
MyProduct2 := TProduct.Create;
MyProduct2.Name := 'P2';
MyProduct3 := TProduct.Create;
MyProduct3.Name := 'P3';
MyDict.Add(MyProduct1, 1);
MyDict.Add(MyProduct2, 2);
MyDict.Add(MyProduct3, 3);
APair := MyDict.ExtractPair(MyProduct1);
Writeln(APair.Key.Name); // <--- Error is Here.
Writeln(IntToStr(APair.Value));
Readln(aKey);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
【问题讨论】:
-
你说
// <--- Error is Here.,但你没有说错误实际上是什么。当您现在正在阅读 SO 的机器上没有安装 XE 的副本时,知道这一点可以更轻松地提供帮助。 -
对不起...我已经添加了具体的异常错误消息。
-
这是个谜,我一辈子都看不到问题!
-
你的意思是所有的源代码都是正确的吗?那会更糟...... :-(你能在你的Delphi IDE安装中重现这个问题吗?
-
如果我在
ExtractPair语句之前添加这一行:APair := TPair<TProduct, Integer>.Create(MyProduct3, 0);,那么我没有异常,但我在APairvar 中也没有MyProduct1数据。
标签: delphi generics exception delphi-xe