2011-06-08 44 views
2

可能重複:嘗試投放使用as操作者一般類型時
「As」 operator for constrained generic types問題的泛型和鑄態

以下還原的樣品的代碼生成編譯錯誤。奇怪的是,is運營商和硬鑄造的組合確實按預期工作。

program Project8; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, Controls, StdCtrls; 

type 
    TControlWrapperBase = class 
    protected 
    FCtrl : TControl; 
    public 
    constructor Create (Ctrl : TControl); 
    end; 

    TControlWrapper <T : TControl> = class (TControlWrapperBase) 
    public 
    function GetControl : T; 
    end; 


constructor TControlWrapperBase.Create(Ctrl : TControl); 
begin 
FCtrl := Ctrl; 
end; 


function TControlWrapper <T>.GetControl : T; 
begin 
Result := FCtrl as T;  // does not compile: E2010 Incompatible Types: TEdit and TControl 

if FCtrl is T then  // this does work 
    Result := T (FCtrl); 
end; 

var 
    Wrapper : TControlWrapper <TEdit>; 
    MyCtl : TEdit; 

begin 
try 
    MyCtl := TEdit.Create(nil); 
    TControlWrapper <TEdit>.Create (MyCtl).GetControl; 
except 
    on E: Exception do 
    Writeln(E.ClassName, ': ', E.Message); 
end; 

end. 

如何克服這種編譯器錯誤?

+0

我可以重現這一點; 'as'cast無法用'不兼容類型'錯誤進行編譯。現在,問題是什麼? :-)順便說一下,這個演員似乎是多餘的。你可以安全地使用'T(FCtrl)',因爲'T'被限制爲'TControl'(或後代)。 – 2011-06-08 16:01:12

+0

@TOndrej:問題是:爲什麼它會失敗?這是一個編譯器錯誤? – jpfollenius 2011-06-08 16:06:42

+0

是的,我個人認爲它是一個編譯器錯誤。演員應該成功似乎是合乎邏輯的。另外,編譯器具有驗證這種演員需要的知識。 – 2011-06-08 16:09:51

回答

1

這是一個已知的問題:"As" operator for constrained generic types

不過,我不明白爲什麼你不能這樣寫:

type 
    TControlWrapper<T: TControl> = class 
    private 
    FCtrl: T; 
    public 
    property Ctrl: T read FCtrl; 
    end; 
+0

我發佈了簡化的摘錄。基本上,我們需要在使用基本類型時訪問控件,但想要在使用派生類型時不使用強制轉換來獲得專用控件。 – jpfollenius 2011-06-08 15:59:17

+1

剛纔意識到我自己問過你鏈接到的問題:)已經太晚了... – jpfollenius 2011-06-08 16:00:28

+0

我上面的代碼將允許所有這些。 – 2011-06-08 16:01:06

1

你已提出近the same question超過2年前。我不知道,因爲在隨後仿製藥德爾福什麼改變,但可能巴里·凱利的回答仍然是有效的 - 因爲

不幸的是,編譯器不 足夠聰明弄清楚,編譯器不能強制轉換泛型 類型約束意味着T是 保證與 指針的大小相同。

+2

其實我們現在有3個版本的同一個問題,都是由@Smasher提出的。哇! – 2011-06-08 16:26:37

+0

好吧,是的,我應該仔細搜索。但另一方面,這些事情在兩年多的時間裏並沒有得到解決,這不是我的錯。順便說一句:梅森惠勒在重複問題中發佈的質量控制報告是關閉的固定... – jpfollenius 2011-06-08 21:51:46

+0

這是幾乎相同的問題?這甚至不是相同的編譯器錯誤。隨着泛型中的所有bug(至少在2009年,顯然還在XE中),這些細微的差異確實很重要。 – jpfollenius 2011-06-09 10:19:11