Swanman's Horizon

性欲をもてあましつつなんらかの話をするよ。

配列の添字にスコープ付き列挙型が使えないバグ。

まず列挙型と配列のおさらい

type
  TGender = (Male, Female); // これが列挙型

var
  population: array[TGender] of UInt64; // こうやって添字に指定できる
begin
  population[Male] := 15;
  population[Female] := 20;
end;

列挙型の一部を添字にしたいとき

type
  TGender = (Unknown, Male, Female);

var
  population: array[Male..Female] of UInt64; // 0..9みたいな感覚で

こういうのを部分範囲型と呼ぶ、ってD6のヘルプが言ってた。えっ、D2010のヘルプ?ごめん何のことかよく分からない。

スコープ付き列挙型

type
  TGender = (Male, Female);
  {$SCOPEDENUMS ON}
  TSex = (Male, Female);
  {$SCOPEDENUMS OFF}

var
  gender: TGender;
  sex: TSex;
begin
  gender := TGender.Male; // 型を付けて限定できる
  gender := Male; // つけなくてもいい
  sex := TSex.Female; // SCOPEDENUMSがONの時は型が必須になる
  sex := Female; // エラー
end.

スコープ付き列挙型で一部の範囲を添字にしたい

var
  hoge: array[TGender.Male..TGender.Female] of Integer;

[エラー] Unit1.pas(7): E2029 ']' が必要な場所に '.' があります

どう見てもバグェ…

何とかしてよコードギアえもーん!

ちなみに

var
  hoge: array[Male..TGender.Female] of Integer;

これだと通る。どうもコンパイラは[の後にTGenderを見つけた時点で、

「次にお前は『] of』と言う!(キリッ」

と勝手に決め付けちゃってるんだよね。おいてめえジジイ。まぁ自分で定義した列挙型ならSCOPEDENUMSを切れば済むんだけど、VCL内などでONとして定義されてる既存の列挙型はどうしようもないからなぁ…。