Эквивалентность и совместимость типов
Совпадение типов
Говорят, что типы T1
и
T2
совпадают, если они имеют одно имя либо
же определены в секции type
в виде T1
= T2
. Таким образом, в описаниях
type IntArray = array [1..10] of integer;
IntArrayCopy = IntArray;
var
a1: IntArray;
a2: IntArrayCopy;
b1,c1: array [1..15] of integer;
b2: array [1..15] of integer;
переменные a1
и
a2
и переменные b1
и c1
имеют один и тот же
тип, а переменные b1
и b2
- разные типы.
Эквивалентность типов
Говорят, что типы T1
и
T2
эквивалентны, если выполняется одно из
следующих условий:
T1
иT2
совпадаютT1
иT2
- динамические массивы с совпадающими типами элементовT1
иT2
- указатели с совпадающими базовыми типамиT1
иT2
- множества с совпадающими базовыми типамиT1
иT2
- процедурные типы с совпадающим списком формальных параметров (и типом возвращаемого значения - для функций)
Если типы эквивалентны только если их имена совпадают, то говорят, что имеет место именная эквивалентность типов. Если типы эквивалентны если они совпадают по структуре, то говорят, что имеет место структурная эквивалентность типов. Таким образом, в PascalABC.NET имеет место именная эквивалентность для всех типов, кроме динамических массивов, множеств, типизированных указателей и процедурных типов, для которых имеет место структурная эквивалентность типов.
Только если типы T1
и
T2
эквивалентны, фактический параметр типа T1
может быть подставлен вместо формального параметра-переменной типа T2
.
Совместимость типов
Говорят, что типы T1
и
T2
совместимы, если выполняется одно из
следующих условий:
T1
иT2
эквивалентныT1
иT2
принадлежат к целым типамT1
иT2
принадлежат к вещественным типам- Один из типов - поддиапазон другого или оба - поддиапазоны некоторого типа
T1
иT2
- множества с совместимыми базовыми типами
Совместимость типов по присваиванию
Говорят, что значение типа T2
можно присвоить переменной типа T1
или тип T2
совместим по присваиванию с типом T1
, если выполняется одно из следующих условий:
T1
иT2
совместимыT1
- вещественного типа,T2
- целогоT1
- строкового типа,T2
- символьногоT1
-pointer
,T2
- типизированный указательT1
- указатель или процедурная переменная,T2=nil
T1
- процедурная переменная,T2
- имя процедуры или функции с соответствующим списком параметровT1
,T2
- классовые типы, один из них - наследник другого. Поскольку в PascalABC.NET все типы кроме указателей являются потомками типаObject
, то значение любого типа (кроме указателей) можно присвоить переменной типаObject
T1
- тип интерфейса,T2
- тип класса, реализующего этот интерфейс
Если тип T2
совместим по присваиванию с типом T1
,
то говорят также, что тип T2
неявно приводится к типу T1
.