Integer “操作数”的类型无效+&引用;Ada 95

Integer “操作数”的类型无效+&引用;Ada 95,integer,range,ada,operand,Integer,Range,Ada,Operand,我在Ada95的ans spec文件中定义了两个整数范围,如下所示: type year is new integer range 1996..2100; type month is new integer range 1..12; 当我编译主体文件的代码时,我有这样一行代码: .... key: integer; begin key:= (yearVal*100) + monthVal; YearVal是年类型,monthVal是月类型,我有以下错误 编译:运算符“+”的

我在Ada95的ans spec文件中定义了两个整数范围,如下所示:

type year is new integer range 1996..2100;
type month is new integer range 1..12;
当我编译主体文件的代码时,我有这样一行代码:

....
    key: integer;
begin 
    key:= (yearVal*100) + monthVal;
YearVal是年类型,monthVal是月类型,我有以下错误

编译:运算符“+”的操作数类型无效

如何添加此值以获得整数?
谢谢

使用。

如前所述,使用类型转换或使用子类型而不是类型。如果您以前没有使用过subtype,下面介绍如何使用:

   subtype year is Integer range 1996 .. 2100;
   subtype month is Integer range 1 .. 12;
   yearVal : year;
   monthVal : month;
然后你可以自由地做:

   key : Integer;
begin
   key := (yearVal*100) + monthVal;

当您使用构造
X是新的
时,您正在创建一个新类型。它与其他类型不兼容,应该存在于它自己的宇宙中,在那里它只与其他
X
类型交互

这意味着您必须事先考虑您的键入策略,以确保您可能要对其执行数学运算的所有对象都属于相同的类型(在相同的宇宙中运行)

如果您想做的是在允许的范围
X
上设置一个界限,但允许它在数学表达式中与其他整数一起运算,则应使用子类型,如下所示:

subtype year is integer range 1996..2100;
(注意:无新代码)

然而,如果你真的希望年和月在它们各自不兼容的宇宙中,但是有一个内部案例,在这个案例中,你需要对它们进行数学转换,你能做的就是在这个案例中将它们转换成整数

key:= (Integer(yearVal)*100) + Integer(monthVal);

同样,如果您每次使用这些对象做任何事情时都必须这样做,那么这将是一个主要的PITA,因此如果是这种情况,它们应该是相同类型的子类型(可能是整数)。

或者(比如
key:=Integer(yearVal)*100+Integer(monthVal);
)或者将年份和月份子类型设置为整数。这将使他克服编译器错误,但可能无法修复此错误暴露的基础设计问题。