Руководство разработчика

Сравнение типов

Сравнение типов применяется для безопасной работы со значениями заранее неопределенного типа. Например, при обращении к элементам индексных переменных смешанного типа. Сравнивать на равенство и неравенство можно как значения стандартных, так и объектных типов. Сравнение происходит без учета наследования. Для сравнения с учетом наследования можно воспользоваться проверкой принадлежности к иерархии. Результатом сравнения типов является значение логического типа. Для сравнения типа переменной или выражения используется ключевое слово ТИП. Допустимые варианты синтаксиса сравнения типов:

<имя типа1> = <имя типа2>
<имя типа1> <> <имя типа2>

ТИП ( <выражение> ) = <имя типа>
<имя типа> = ТИП ( <выражение> )

ТИП ( <выражение> ) <> <имя типа>
<имя типа> <> ТИП ( <выражение> )

ТИП ( <выражение1> ) = ТИП ( <выражение2> )
ТИП ( <выражение1> ) <> ТИП ( <выражение2> ) 

Разные имена типов могут давать истинный результат сравнения, если используются синонимы типов.

Пример:

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

Для объектных типов важно различать тип выражения, известный на этапе компиляции, и тип во время выполнения. Сравнение типов происходит во время выполнения и статически известный тип может отличаться от действительного типа объектного значения.

Пример:

// некий тип А
ТИП А [ ]
// тип Б - потомок А
ТИП Б(А) [ ]
// функция принимает параметр типа А
ФУНКЦИЯ Ф(ПЕРЕМ А: а)
// можно ожидать, что покажтся сообщение "А !!!", но это не так
ЕСЛИ ТИП (а) = А ТО СООБЩЕНИЕ("А !!!") КОНЕЦ_ЕСЛИ
// реальный тип переменной а в этом примере - Б 
ЕСЛИ ТИП (а) = Б ТО СООБЩЕНИЕ("Б !!!") КОНЕЦ_ЕСЛИ
КОНЕЦ_ФУНКЦИИ 

ВЫЧИСЛИТЬ
  // создаем переменную типа Б
  ПЕРЕМ Б: б
  // передаем ее в функцию Ф, т.к. А - предок Б, то ошибки нет
  Ф(б)
КОНЕЦ

Кроме сравнения типов на равенство и неравенство, поддерживается проверка переменной на возможность изменения типа. Во время выполнения изменять тип переменной можно только в том случае, если ее исходный тип задан как одна из разновидностей неопределенного типа. Проверка записывается в виде пары ключевых слов ЛЮБОЙ ТИП:

ЛЮБОЙ ТИП(<переменная>)

Пример:

ВЫЧИСЛИТЬ
  ПЕРЕМ СТРОКА: с = "Абв"
  ПЕРЕМ *: в = "Абв"
  
  ПЕРЕМ ЛОГИКА: рез = ЛЮБОЙ ТИП(с) // НЕТ
  
  ЕСЛИ ЛЮБОЙ ТИП(в) ТО // ДА
    в = 42 // Ок, тип изменен со СТРОКА на ЦЕЛОЕ
  КОНЕЦ_ЕСЛИ
  
  ОТЛАДКА(в) // 42
КОНЕЦ

См. также: