関数の定義域と値域の指定 - 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]