2

我正在使用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]到我的手表告诉我要调用的函数 {System.Generics.Collections}TDictionary.GetItem 已被链接器消除

有人在这里问过类似的问题,关于如何避免链接器在调试期间消除功能。由此我收集到,编译器/链接器假定我没有使用它。有人建议——在谈话中——我应该尝试更多地使用它。

所以我创建了以下代码:

FFieldNames.Add(Name, S);
V := FFieldNames.Items[Name];

其中S和是Name字符串V。这是来自FFieldNames填充数据的代码。 V的唯一目的是获取刚刚插入的S;它什么也不做。

奇怪的是,虽然调试器告诉我同样的事情(GetItem即被淘汰),V但它确实被设置为预期值。但它不在我的TSheet.GetFieldName功能中。:|

我错过了什么?

4

1 回答 1

-1

同样的问题适用于TList<>. 即使代码使用类中的方法,调试器也无法访问它(“链接器消除了 TList 上的 xxx”)。我想这通常是泛型的问题。

如果你做一个后代类就不会出现这个问题

type
  TMyList = class(TList<TMyObject>)

  end;

var
  List : TMyList;
begin
  ...

end;
于 2017-09-07T05:47:33.840 回答