delphi - ¿Por qué obtengo el error "type no tiene typeinfo" con un tipo de enumeración?
enums rtti (2)
La información de tipo no se admite en las enumeraciones donde se asignan valores ordinales específicos que dan como resultado que los miembros de la enumeración tengan valores ordinales que son diferentes a los que normalmente asignaría el compilador.
Si los valores específicos son esenciales o deseables, los miembros enum "no utilizados" deberán insertarse para "rellenar" la enumeración según sea necesario. por ej. (sangría adicional solo para énfasis):
type
TMyEnum = (
meNOTUSED1, {= 0}
meFirstValue, {= 1}
meSecondValue,
meThirdValue
);
Un subrango se puede usar para "filtrar" el valor inicial no utilizado:
TValidMyEnum = meFirstValue..meThirdValue;
Aunque es posible que desee considerar el cambio de nombre del tipo de enumeración original para que su tipo de subintervalo se pueda utilizar a lo largo de su proyecto.
Un subrango no es suficiente si la enumeración contiene "espacios":
type
TMyEnum = (
meNOTUSED1, {= 0}
meFirstValue, {= 1}
meSecondValue,
meThirdValue,
meNOTUSED2,
meFinalValue {= 5}
);
En este caso, no hay una forma sencilla de extender la verificación de rango en tiempo de compilación para excluir los miembros no utilizados, pero un par de tipos de conjunto simplificará el negocio de implementar cualquier verificación de tiempo de ejecución necesaria:
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
He declarado el siguiente tipo de enumeración en el que quiero que el primer miembro tenga el valor ordinal de 1 (uno) en lugar del 0 (cero) habitual:
type
TMyEnum = (
meFirstValue = 1,
meSecondValue,
meThirdValue
);
Si llamo a TypeInfo () , por ejemplo, como parte de una llamada a GetEnumName () , obtengo un error de compilación:
GetEnumName(TypeInfo(TMyEnum), Ord(aValue));
ERROR: "E2134: Escriba ''TMyEnum'' no tiene typeinfo"
¿Por qué es esto?
Sé que las clases solo tienen typeinfo si están compiladas con la opción del compilador $ M habilitada o (derivan de alguna clase que fue, como TPersistent ) pero no creo que haya ninguna condición especial para tener typeinfo para los tipos enum.
Las enumeraciones y enumeraciones discontinuas que no comienzan en cero no tienen typeinfo. Para que se implemente typeinfo, debería estar en un formato diferente del existente tkEnumeration, debido a problemas de compatibilidad con versiones anteriores.
Consideré implementar una tkDiscontiguousEnumeration (o posiblemente un miembro mejor nombrado) para Delphi 2010, pero el beneficio parecía pequeño teniendo en cuenta su escasez relativa y las dificultades en la enumeración: ¿cómo codifica los rangos de manera eficiente? Algunas codificaciones son mejores para algunos escenarios, peor para otros.