2013-03-08 49 views
2

我使用的是<string, string>TDictionary。但出於某種原因,鏈接器決定我不想從中取出項目。GetItem on TDictionary由鏈接器提供

我有以下代碼:

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被鏈接器取消。

Someone asked here on a similar issue關於如何在調試過程中避免鏈接器消除功能。從我收集的信息來看,編譯器/鏈接器假定我沒有使用它。有人建議 - 在對話期間 - 我應該嘗試使用它更多

因此,我創建了下面的代碼:

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

SNameV都是字符串。這是來自FFieldNames充滿數據的代碼。 V的唯一目的是獲得剛插入的S;它什麼都不做。

奇怪的是,雖然調試器告訴我同樣的事情(即GetItem被淘汰),但V確實設置爲預期值。但它不在我的TSheet.GetFieldName函數中。 :|

我錯過了什麼?

+1

我覺得你的代碼是錯誤的反正。如果該鍵不存在,則使用'Items []'將導致異常。你需要'TryGetValue'。而且你還需要確保你不會查找兩次的值。如果不是FFieldNames.TryGetValue(Field,Result),那麼Result:= Default;'或者你的意思是,如果不是FFieldNames.TryGetValue(Field,Result),那麼Result:= Default;'。另外,由於您總是覆蓋,所以'Result:= Default'毫無意義。編譯器會告訴你,如果你打開警告。 – 2013-03-08 09:52:03

+0

這個錯誤只發生在似乎與泛型混淆的調試器中。你的錯誤絕對不是由連接器造成的。 – jpfollenius 2013-03-08 10:18:56

+0

我發佈後我意識到自己的錯誤;使用'ContainsKey()'使它工作!但Heffernan提出的'TryGetValue'也是一個好主意。感謝那。 – Svip 2013-03-08 10:48:37

回答

0

同樣的問題適用於TList<>。即使代碼在類中使用方法,也無法從調試器訪問(「由鏈接器清除的TList上的xxx」)。我想這是一般泛型的問題。

如果你犯了一個派生類不會有這樣的問題

type 
    TMyList = class(TList<TMyObject>) 

    end; 

var 
    List : TMyList; 
begin 
    ... 

end;