DelphiのEnumリフレクションの闇

Delphiでリフレクションを介してEnumの要素名を取ろうとしたら、謎のコンパイルエラーに見舞われた件、追加情報もらえたのでまとめました。
0
Ktz @ktz_alias

#delphi #xe5 enumのシンボル名をRTTIで取り出そうとしたら、E2134(型情報を持っていません)エラーでコンパイル失敗しやがる。どうも0でない値から開始するとダメらしくてマジふざけんなって感じぃ stackoverflow.com/questions/1420…

2016-07-22 13:55:16
Ktz @ktz_alias

#delphi きっと最新版は直されてる、と信じることにする

2016-07-22 13:55:46
Owl's perspective @owlsperspective

@ktz_alias 値が-1以下または256以上はダメだったかと(0..255はOK)

2016-07-22 13:59:42
Ktz @ktz_alias

@owlsperspective 1から開始したらコンパイルエラーになったんですわ

2016-07-22 14:00:55
Owl's perspective @owlsperspective

@ktz_alias これですね stackoverflow.com/questions/1420… 当時のコンパイラ担当エンジニアのBarry Kellyさんがこう書いているってことは望み薄かも?

2016-07-22 14:31:24
Owl's perspective @owlsperspective

@ktz_alias QPにも登録されてます quality.embarcadero.com/browse/RSP-121… 一応オープンはされてますが…

2016-07-22 14:32:09
Owl's perspective @owlsperspective

@ktz_alias どうも列挙の値が0から連続していることが必要なようですな

2016-07-22 14:38:05
Owl's perspective @owlsperspective

@ktz_alias はい、10.1 Berlinでも同様です。ただDelphiではビットフラグは列挙型じゃなくて集合型(set of)を使うのが一般的なので…

2016-07-22 14:57:32
スワンマン∞ @lynatan

@owlsperspective @ktz_alias docwikiで単純型のページの列挙型の項を見たら、定数が指定されてるとRTTIは生成されないとわざわざ明記されてるんで、現状はバグではなく仕様なんでしょうね

2016-07-22 16:07:00
Owl's perspective @owlsperspective

@ktz_alias @lynatan どうもSOのBarry Kellyさんの書きっぷりだと、列挙の要素が連続してないと実装がめんどくさい、っていう話かなと。

2016-07-22 16:15:03
スワンマン∞ @lynatan

@owlsperspective @ktz_alias TEnum=(A=1,B=10)のAとBの間には無名の値が存在するという実装なので(array[TEnum] of ByteのSizeOfは10)、この開きが大きい程RTTIのサイズが爆発的に増加することに…

2016-07-22 16:30:52