Совместимость типов
Чтобы они считались совместимыми, процедурные типы должны иметь одно и то же число параметров, а параметры в соответствую- щих позициях должны иметь тождественные типы. При определении совместимости процедурных типов имена параметров значения не име- ют. Значение nil совместимо с любым процедурным типом.
Чтобы использоваться в качестве процедурных значений, проце- дуры и функции должны описываться с директивой far и компилиро- ваться в состоянии с {$F+}. Кроме того, в качестве процедурных значений не могут указываться стандартные процедуры и функции, вложенные процедуры и функции, методы, процедуры и функции, опи- санные с ключевым словом inline или interrupt.
Стандартные процедуры и функции - это подпрограммы, описан- ные в модуле Unit, например, WriteLn, ReadLn, Chr или Ord. Чтобы использовать в качестве процедурного значения стандартную проце- дуру и функцию, напишите для нее "оболочку". Например, следующая функция DSin совместима по присваиванию с описанным выше типом MathFunc:
function FSin(X: Real): Real; far; begin FSin := Sin(X); end;
Процедура или функция является вложенной, когда она описыва- ется внутри другой процедуры или функции. Такие вложенные проце- дуры и функции не могут использоваться в качестве процедурных значений.
Иногда, например, в выражениях и операциях сравнения, требу- ется совместимость типов. Совместимость типов, кроме того, явля- ется важной предпосылкой для совместимости по присваиванию.
Совместимость типов имеет место, если выполняется по крайней мере одно из следующих условий:
* Оба типа являются одинаковыми.
* Оба типа являются вещественными типами.
* Оба типа являются целочисленными.
* Один тип является поддиапазоном другого.
* Оба типа являются отрезками одного и того же основного ти- па.
* Оба типа являются множественными типами с совместимыми ба- зовыми типами.
* Один тип является строковым типом, а другой - строковым типом, упакованным строковым типом или типом PChar;
* Один тип - это тип Pointer, а другой - любой ссылочный тип.
* Один тип является типом PChar, а другой - символьным мас- сивом с нулевой базой вида array[0..X] of Char (это дейс- твует только при разрешении директивой {$X+} расширенного синтаксиса).
* Оба типа являются указателями идентичных типов (это дейс- твует только при разрешении указателя с проверкой типа ди- рективой {$X+}).
* Оба типа являются процедурными с идентичными типами ре- зультатов, одинаковым числом параметров и соответствием между параметрами.