2013-04-24 83 views
3

這可能是下面的前一個問題類似/延續:德爾福XE4給E2036「對象的

Why Delphi XE3 gives "E2382 Cannot call constructors using instance variables"?

現在我想要的Delphi XE4代碼相同(與」根據上述問題的解決方案,將「構造函數」更改爲「過程」)。

現在我有一個泛型列表也是這些東西,即我有

TCoordRect = object 
public 
    function Something: Boolean; 
end; 

,然後對這些函數中的參數列表,這是我遍歷並嘗試直接訪問項目:

function DoSomething(AList: TList<TCoordRect>): Boolean; 
var 
    i: Integer; 
begin 
    Result := False; 
    for i := 0 to AList.Count - 1 do 
    begin 
    Result := Result or AList[i].Something; // <-- Here comes the compiler error! 
    end; 
end; 

這給編譯器錯誤「E2036需要變量」。但是,如果我不直接訪問它,即認沽期權,而不是一個局部變量和使用,首先,然後它的工作原理:

function DoSomething(AList: TList<TCoordRect>): Boolean; 
var 
    i: Integer; 
    ListItem: TCoordRect; 
begin 
    Result := False; 
    for i := 0 to AList.Count - 1 do 
    begin 
    ListItem := AList[i]; 
    Result := Result or ListItem.Something; // <-- Now this compiles! 
    end; 
end; 

另有「解決辦法」是刪除所有這些「對象」的類型和對其進行更改到'班',但我很好奇,爲什麼這不像以前那樣工作?這又是「編譯器朝着移動開發邁進」還是有一些更具體的原因,還是這是一個錯誤?順便說一句,我也報道這是一個質量控制問題,所以會看到是否有東西來自那裏。

回答

3

這是一個編譯器錯誤,它存在於所有早期版本的編譯器中。故障不限於XE4。提交QC報告是正確的迴應。

如果Embarcadero從未試圖修復它,我不會感到驚訝。這是因爲您正在使用已棄用的object。切換到使用record和代碼編譯。

您在此問題中發現的問題與您在問題頂部提到的SO問題無關。

順便說一下,這確實是一箇舊遇到新的情況。傳統Turbo Pascal對象和現代通用容器。你在混合油和水!

+0

我不確定在Delphi中恢復對象類型是否真的是**遺留**。 – OnTheFly 2013-04-24 13:31:38

+0

關於'所有早期版本' - 相同的代碼在XE3和XE2上編譯沒有錯誤。我也不會感到驚訝,如果他們沒有解決這個問題,我同意這是一箇舊的遇到新的問題:)。與另一個問題的關係主要是因爲它基於相同的代碼,所以我猜這取決於你定義的關係,對我來說它是相關的。附:如果我從任何地方得到比「編譯器bug」更多的內部答案,那麼我會接受,否則我會接受你的答案:) – DelphiUser 2013-04-24 13:32:10

+1

@DelphiUser不適合我。代碼以與2010年完全相同的方式失敗,XE2,XE3和XE4。從另一個問題涉及'object'的構造函數這個意義上講,這個問題並不相關,這個問題涉及到一個泛型編譯器的bug。 – 2013-04-24 13:37:00