Когда вы используете конструкцию X is new
, вы создаете новый тип . Он несовместим с другими типами и должен существовать в своего рода вселенной, где он взаимодействует только с другими типами X
.
Это означает, что вам действительно нужно заранее продумать свою стратегию набора текста, чтобы убедиться, что все объекты, для которых вы хотите выполнять математику, относятся к одному и тому же типу (работающему в одной и той же вселенной).
Если вместо этого то, что вы хотели сделать, это поставить ограничение на допустимый диапазон X
, но разрешить ему работать в математических выражениях с другими целыми числами, вы должны вместо этого использовать подтипы , например, так:
subtype year is integer range 1996..2100;
(примечание № new
).
Однако, если вы действительно хотите, чтобы Year
s и Month
s находились в их собственных несовместимых вселенных, но у вас есть один внутренний случай, когда для преобразований вам нужно выполнять с ними математику, то вы можете преобразовать их в целые числа в этом одном случае.
key:= (Integer(yearVal)*100) + Integer(monthVal);
Опять же, это будет основной PITA, если вам придется делать это каждый раз, когда вы используете эти объекты для чего-либо, поэтому, если это так, они должны быть подтипами одного типа (вероятно, Integer).