delphi - 链接器消除了 TDictionary 上的 GetItem

标签 delphi linker tdictionary

我正在使用 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;
FFieldNamesTDictionary<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 , NameV是字符串。这是来自 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/

相关文章:

string - 在函数的参数中使用Tmemo的多行

linker - w64-Mingw LLVMSupport.a : undefined reference to __imp_*

qt - 在 Qt 中使用 OpenGL 时出现链接器错误

Delphi TDictionary迭代

Delphi XE5 Rest Datasnap 服务器。获取客户端IP地址

multithreading - 正确的线程销毁

performance - TDictionary<TObject, TObject> 的默认 IEqualityComparer?

delphi - 如何为从 TDictionary 派生的类创建自定义枚举器?

Delphi:免费 TSynEdit 替代品

c++ - 在 Linux 上使用 zlib 编译 boost