Delphi 2010 では、いつ にISomeGenericInterface<T>
割り当て可能ISomeGenericInterface<T>
ですか?
次のプログラムは、期待どおりにコンパイルおよび実行されます...
unit uGenDemo;
interface
{.$define declare-a-type}
function Tokenize: IEnumerator<string>;
{$IFDEF declare-a-type}
type TX = integer;
{$ENDIF}
implementation
uses SysUtils;
type
IStringEnumerator = interface( IEnumerator<string>)
['{3A28E4FB-CDF7-4933-8D67-D9EF5C2466E0}']
end;
TBaseEnumerator = class( TInterfacedObject, IEnumerator)
private
function MoveNext: Boolean;
function BaseGetCurrent: TObject;
function IEnumerator.GetCurrent = BaseGetCurrent;
procedure Reset;
end;
TStringEnumerator = class( TBaseEnumerator, IStringEnumerator)
private
function GetCurrent: string;
property Current: string read GetCurrent;
end;
function Tokenize: IEnumerator<string>;
begin
result := TStringEnumerator.Create as IStringEnumerator
end;
{ TBaseEnumerator }
function TBaseEnumerator.BaseGetCurrent: TObject;
begin
result := nil
end;
function TBaseEnumerator.MoveNext: Boolean;
begin
result := False
end;
procedure TBaseEnumerator.Reset;
begin
end;
{ TStringEnumerator }
function TStringEnumerator.GetCurrent: string;
begin
result := ''
end;
end.
...ただし、関数を宣言した後に任意の型を宣言するTokenize()
と、たとえば行を次のように変更して...
{.$define declare-a-type}
... に ...
{$define declare-a-type}
...コンパイラはボークしてエラーをスローします...
[DCC Error] uGenDemo.pas(43): E2010 Incompatible types: 'IEnumerator<System.string>' and 'IStringEnumerator'
なんで?
- これはコンパイラのバグですか?
- 一般に、一般的にパラメーター化された祖先型のインターフェイス ポインターにインターフェイス ポインターを割り当てることは安全ですか?
(私のコンパイラのバージョンは Embarcadero® Delphi® 2010 バージョン 14.0.3593.25826 です)