2

重複の可能性:
Delphi 2010 でジェネリック インターフェイスを返すジェネリック メソッド

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'

なんで?

  1. これはコンパイラのバグですか?
  2. 一般に、一般的にパラメーター化された祖先型のインターフェイス ポインターにインターフェイス ポインターを割り当てることは安全ですか?

(私のコンパイラのバージョンは Embarcadero® Delphi® 2010 バージョン 14.0.3593.25826 です)

4

0 に答える 0