열거 유형으로 "type type no typeinfo가 없음"오류가 발생하는 이유
문제
나는 첫 번째 멤버가 평소 0 (0)보다는 1 (1)의 서수 값을 갖기를 원하는 다음 열거 유형을 선언했습니다.
type
TMyEnum = (
meFirstValue = 1,
meSecondValue,
meThirdValue
);
내가 전화하면 typeinfo (), 예를 들어 전화의 일환으로 getenumname (), 컴파일러 오류가 발생합니다.
GetEnumName(TypeInfo(TMyEnum), Ord(aValue));
오류 : "e2134 : type 'tmyenum'은 typeinfo가 없습니다."
왜 이런거야?
나는 클래스가 typeinfo만이 $ m 컴파일러 옵션 활성화 또는 (일부 클래스에서 파생, 예 : tpersistent) 그러나 나는 열거 유형에 대한 typeinfo를 갖는 특별한 조건이 있다고 생각하지 않았다.
해결책 2
특정 서수 값이 할당되는 열거 값에 대해 유형 정보가 지원되지 않습니다.
특정 값이 필수적이거나 바람직한 경우 "사용하지 않은"열거 회원은 필요에 따라 열거를 "패드"에 삽입해야합니다. 예 : (강조만을위한 추가 들여 쓰기) :
type
TMyEnum = (
meNOTUSED1, {= 0}
meFirstValue, {= 1}
meSecondValue,
meThirdValue
);
그런 다음 서브 랜지를 사용하여 사용하지 않은 초기 값을 "필터링"할 수 있습니다.
TValidMyEnum = meFirstValue..meThirdValue;
그런 다음 프로젝트 전체에서 서브 레인지 유형을 사용할 수 있도록 원래 열거 유형의 이름을 바꾸는 것을 고려할 수 있습니다.
열거에 "갭"이 포함 된 경우 서브 랜지가 충분하지 않습니다.
type
TMyEnum = (
meNOTUSED1, {= 0}
meFirstValue, {= 1}
meSecondValue,
meThirdValue,
meNOTUSED2,
meFinalValue {= 5}
);
이 경우 사용하지 않은 회원을 제외하기 위해 컴파일 타임 범위 점검을 확장하는 방법은 없지만 몇 가지 세트 유형이 필요한 모든 구현 사업을 단순화합니다. 실행 시간 체크 무늬:
type
TMyEnums = set of TMyEnum;
const
meNOTUSED = [meUNUSED1, meUNUSED2]; // .. etc as required
meValidValues = [Low(TMyEnum)..High(TMyEnum)] - meNOTUSED;
if NOT (aValue in meValidValues) then
// etc
다른 팁
0에서 시작하지 않는 불연속 열거 및 열거에는 typeinfo가 없습니다. TypeInfo가 구현 되려면 뒤로 호환성 문제로 인해 기존의 tkenumeration과 다른 형식이어야합니다.
나는 Delphi 2010을 위해 tkdiscontiguouseUnumeration (또는 더 나은 명명 된 멤버)을 구현하는 것을 고려했지만, 상대적 부족과 열거의 어려움을 고려할 때 혜택은 작은 것처럼 보였습니다. 어떻게 범위를 효율적으로 인코딩합니까? 일부 인코딩은 일부 시나리오에서는 더 좋습니다.