在隐式 class 运算符中防止值超出范围的适当方法是什么?

What's the appropriate way to prevent a value out of range in an implicit class operator?

what I'm working on 的一小部分引导我创建我自己的记录类型,它需要特定范围的 Double。例如,在 HSV 颜色模型中,色调表示为从 0360 的双精度值。我不能像定义整数那样定义这种类型:

type
  THue = 0.0..360.0;

只是行不通。因此,我正在使用隐式 class 运算符进行记录,以与 Double:

兼容
type
  THue = record
  private
    FValue: Double;
  public
    class operator implicit(Value: THue): Double;
    class operator implicit(Value: Double): THue;
  end;

class operator THue.implicit(Value: THue): Double;
begin
  Result:= Value.FValue;
end;

class operator THue.implicit(Value: Double): THue;
begin
  //Need to restrict range to 0..360 here...
  Result.FValue:= Value;
end;

但是,在分配 Double --> THue 时,我不确定声明 0..360 范围的适当方法是什么。我可以引发异常,使用 Assert 语句,引发编译器错误,自动将值更改为在范围内,或者其他我没有考虑的事情。

我很自然地喜欢提出自己的异常类型,例如 EValueOutOfRange,但编译器错误会更有意义。

在这种情况下,我应该如何防止分配超出范围的值?

编译器无法为您验证范围。您只需:

  1. 调整数值确保不超出范围:

    class operator THue.implicit(Value: Double): THue;
    begin
      if Value < 0.0 then Value := 0.0
      else if Value > 360.0 then Value := 360.0;
      Result.FValue := Value;
    end;
    
  2. 引发异常(这也适用于断言,可以关闭,所以不是最好的选择):

    class operator THue.implicit(Value: Double): THue;
    begin
      if (Value < 0.0) or (Value > 360.0) then raise ...;
      Result.FValue := Value;
    end;
    

这些是你的选择。