2013-08-09 1 views
2

RTTI에서 일반 레코드를 사용하려고하지만 유형 정보에 문제가 있습니다. 왜 다음은 Delphi 2010을 사용하여 컴파일되지 않는지 아는 사람이 있습니까?일반 레코드 용 Delphi TypeInfo

[DCC Error] GenericTypeInfo.dpr(24): E2134 Type 'TMyInt' has no type info 
[DCC Error] GenericTypeInfo.dpr(24): E2134 Type 'TMyString' has no type info 

나는 2 사이의 큰 차이는 무엇을 할 수 없습니다

program GenericTypeInfo; 

{$APPTYPE CONSOLE} 

uses 
    TypInfo, 
    SysUtils; 

type 

    TMyRec<T> = record 
    public 
    Value: T; 
    end; 

    TMyInt = TMyRec<Integer>; 
    TMyString = TMyRec<String>; 

begin 

    try 
    Writeln(GetTypeName(TypeInfo(TMyRec<Integer>)));  <--- This works fine 
    Writeln(GetTypeName(TypeInfo(TMyRec<String>)));  <--- so does this 
    Writeln(GetTypeName(TypeInfo(TMyInt)));    <--- BUT this won't compile 
    Writeln(GetTypeName(TypeInfo(TMyString)));   <--- nor this!! 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 

    Readln; 

end. 

선은 위의 다음과 같은 컴파일러 오류를 생성하여 표시된? 나는 저급 전문가는 아니지만 컴파일러가 왜 이것을 다르게 취급 하는가? TMyInt 및 TMyString 유형에서 작동해야합니다.

도움 주셔서 감사합니다.

+1

컴파일러 보고서를합니까 나는 내 게시물이 포함 했어야 미안 물론 오류 –

+0

예 : [DCC 오류] GenericTypeInfo.dpr (24)가 제네릭에 관해서 E2134 유형 'TMyInt은'어떤 유형의 정보 –

+2

이 없습니다 RTTI 생성은 아직 100 % 완료되지 않았습니다. –

답변

6

이것은 XE 이상에서 수정 된 bug in Delphi 2010입니다.

그러나 workaround이 있습니다.

+0

+1 내가 아는 한 해결 방법은 컴파일 할 수 있지만 슬프게도 사용할 수있는 유형 정보가 없습니다 (메서드는 nil을 반환합니다). –

+0

해결 방법은 유효하지만 감사합니다. 지금은 런타임 유형으로 실행 중입니다. RTTI와 관련된 문제. 위의 해결 방법은 RTy & TValue.Make를 사용하여 TMyString 속성에 할당 할 수없는 것으로 보이는 TMyRec 에 대한 TypeInfo를 반환합니다. 어떤 아이디어? 아니면 다른 질문을 게시해야합니까? –

+0

@ArnaudBouchez이 기사에 따르면 그럴 수도 있지만 실제로이 경우에는 유효한 TypeInfo를 반환합니다. TypeInfo가 호환되어야하므로 해당 속성에 대해 typeinfo/RTTI가없는 것 같습니다 (TMyString *은 TMyString과 동일하므로 ) –

3

이 예제는 XE2에서 잘 작동합니다. (그리고 @StefanGlienke가 말한대로 XE).

RTTI 및 Delphi-2010의 제네릭에는 여러 가지 구현이 없습니다.

유형의 해석은 컴파일러 마술에 의해 수행되므로 해결 방법은 업그레이드하는 것입니다.

+0

정보를 제공해 주셔서 감사 드리며 업그레이드를 원할 수도 있지만 비용을 지출하기 전에 다른 솔루션을 탐색하고 다른 라이브러리를 업그레이드하는 등 많은 시간을 보내고 싶습니다. –