Сравнение типов
Сравнение типов применяется для безопасной работы со значениями заранее неопределенного типа. Например, при обращении к элементам индексных переменных смешанного типа. Сравнивать на равенство и неравенство можно как значения стандартных, так и объектных типов. Сравнение происходит без учета наследования. Для сравнения с учетом наследования можно воспользоваться проверкой принадлежности к иерархии. Результатом сравнения типов является значение логического типа. Для сравнения типа переменной или выражения используется ключевое слово ТИП. Допустимые варианты синтаксиса сравнения типов:
<имя типа1> = <имя типа2> <имя типа1> <> <имя типа2> ТИП ( <выражение> ) = <имя типа> <имя типа> = ТИП ( <выражение> ) ТИП ( <выражение> ) <> <имя типа> <имя типа> <> ТИП ( <выражение> ) ТИП ( <выражение1> ) = ТИП ( <выражение2> ) ТИП ( <выражение1> ) <> ТИП ( <выражение2> )
Разные имена типов могут давать истинный результат сравнения, если используются синонимы типов.
Пример:
ВЫЧИСЛИТЬ // объявляем индексную переменную со смешанным типом элементов ПЕРЕМ *: ип [СТРОКА] = ("фамилия": "Иванов", "дата1": 12.01.2016, "дата2": 13.02.2016) // проверяем тип элемента индексной переменной ЕСЛИ ТИП(ип["дата1"]) = ДАТА ТО // теперь можно с полной уверенностью в типе обратиться к значению элемента ПЕРЕМ ДАТА: д д = ип["дата1"] КОНЕЦ_ЕСЛИ ЕСЛИ ТИП(ип["дата1"]) <> ТИП(ип["дата2"]) ТО // можно обработать неравенство типов, там где ожидалось равенство... КОНЕЦ_ЕСЛИ КОНЕЦ
Для объектных типов важно различать тип выражения, известный на этапе компиляции, и тип во время выполнения. Сравнение типов происходит во время выполнения и статически известный тип может отличаться от действительного типа объектного значения.
Пример:
// некий тип А ТИП А [ ] // тип Б - потомок А ТИП Б(А) [ ] // функция принимает параметр типа А ФУНКЦИЯ Ф(ПЕРЕМ А: а) // можно ожидать, что покажтся сообщение "А !!!", но это не так ЕСЛИ ТИП (а) = А ТО СООБЩЕНИЕ("А !!!") КОНЕЦ_ЕСЛИ // реальный тип переменной а в этом примере - Б ЕСЛИ ТИП (а) = Б ТО СООБЩЕНИЕ("Б !!!") КОНЕЦ_ЕСЛИ КОНЕЦ_ФУНКЦИИ ВЫЧИСЛИТЬ // создаем переменную типа Б ПЕРЕМ Б: б // передаем ее в функцию Ф, т.к. А - предок Б, то ошибки нет Ф(б) КОНЕЦ
Кроме сравнения типов на равенство и неравенство, поддерживается проверка переменной на возможность изменения типа. Во время выполнения изменять тип переменной можно только в том случае, если ее исходный тип задан как одна из разновидностей неопределенного типа. Проверка записывается в виде пары ключевых слов ЛЮБОЙ ТИП:
ЛЮБОЙ ТИП(<переменная>)
Пример:
ВЫЧИСЛИТЬ ПЕРЕМ СТРОКА: с = "Абв" ПЕРЕМ *: в = "Абв" ПЕРЕМ ЛОГИКА: рез = ЛЮБОЙ ТИП(с) // НЕТ ЕСЛИ ЛЮБОЙ ТИП(в) ТО // ДА в = 42 // Ок, тип изменен со СТРОКА на ЦЕЛОЕ КОНЕЦ_ЕСЛИ ОТЛАДКА(в) // 42 КОНЕЦ