我正在使用 TDictionary
的 <string, string>
.但是由于某种原因,链接器决定我不想从中获取项目。
我有以下代码:
function TSheet.GetFieldName(Field: string; Default: string): string;
begin
Result := Default;
if FFieldNames[Field] = '' then
Result := Field
else
Result := FFieldNames[Field];
end;
FFieldNames
是 TDictionary<string, string>
.在第 2 行 (if FFieldNames[Field] = '' then
) 上,它抛出一个“找不到文件”异常。添加 FFieldNames[Field]
我的 watch 告诉我要调用的函数 {System.Generics.Collections}TDictionary.GetItem 已被链接器消除。Someone asked here on a similar issue关于如何避免链接器在调试期间消除功能。由此我收集到,编译器/链接器假定我没有使用它。有人建议 - 在谈话中 - 我应该尝试更多地使用它。
所以我创建了以下代码:
FFieldNames.Add(Name, S);
V := FFieldNames.Items[Name];
在哪里
S
, Name
和 V
是字符串。这是来自 FFieldNames
的代码充满了数据。 V
的唯一目的是获取刚刚插入的S
;它什么也不做。奇怪的是,虽然调试器告诉我同样的事情(即
GetItem
被淘汰),但 V
确实设置为预期值。但它不在我的TSheet.GetFieldName
功能。 :|我错过了什么?
最佳答案
同样的问题适用于 TList<>
.即使代码使用类中的方法,调试器也无法访问它(“链接器消除了 TList 上的 xxx”)。我想这通常是泛型的问题。
如果你创建一个后代类就不会出现这个问题
type
TMyList = class(TList<TMyObject>)
end;
var
List : TMyList;
begin
...
end;
关于delphi - 链接器消除了 TDictionary 上的 GetItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15290943/