関数の定義域と値域の指定 - delphi
[id:lethevert:20050719:p2]の続き。
そういえば、delphiは、「1..10」みたいな型が指定できたな、と思い出したので、試してみました。
type TOneToTen = 1..10; TOneToTwenty = 1..20; function DoDouble(src:TOneToTen):TOneToTwenty; begin Result := 2*src; end; procedure TForm1.Button1Click(Sender: TObject); var src: TOneToTen; dst: TOneToTwenty; begin //src := 20; src := StrToInt(Edit1.Text); dst := DoDouble(src); Edit2.Text := IntToStr(dst); end;
で、これはあっさりコンパイルが通ってしまいました。全然チェックしてなかったです。
ちなみに、コメントアウトしてある「src := 20」の方を有効にしてみると、コンパイルエラーになったので、定数式のときのみ、チェックが行われているようです。
でも、なぜ、Integer -> 0..10 みたいなキャストを、警告もヒントもなく許してしまうのか? これって、ナローイングじゃないの?
-
-
- -
-
(追記 on 27/Jul/2005)
コメントしたように、オプションの「範囲チェック」を有効にすれば、実行時に範囲チェックを行って、実行時エラーは拾ってくれました。ということは、いわゆる「契約による設計」的なことは可能ということですね。[id:lethevert:20050717:p1]