Compatibilité et identité de types (Object Pascal)

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Types de données, variables et constantes - Index


Pour comprendre quelles opérations peuvent être effectuées sur quelles expressions, il est nécessaire de distinguer diverses formes de compatibilité dans les types et les valeurs. Il s'agit des modificateurs suivants

  • Identité de types
  • Compatibilité de types
  • Compatibilité pour l'assignation

Identité de types

Quand un identificateur de type est déclaré en utilisant, sans qualification, un autre identificateur de type, les deux désignent le même type. Ainsi, étant donné les déclarations suivantes :

type
  T1 = Integer;
  T2 = T1;
  T3 = Integer;
  T4 = T2;

T1, T2, T3, T4 et Integer désignent tous le même type. Pour créer des types distincts, répétez le mot type dans la déclaration. Par exemple,

type TMyInteger = type Integer;

crée un nouveau type appelé TMyInteger différent du type Integer.

Les constructions du langage qui fonctionnent comme des noms de type désignent un type différent à chaque nouvelle occurrence. Ainsi, les déclarations suivantes :

type
  TS1 = set of Char;
  TS2 = set of Char;

créent deux types distincts, TS1 et TS2. De même les déclarations de variable

var
  S1: string[10];
  S2: string[10];

créent deux variables de types distincts. Pour créer des variables du même type, utilisez :

var S1, S2: string[10];

ou

type MyString = string[10];
var
    S1: MyString;
    S2: MyString;

Compatibilité des types

Chaque type est compatible avec lui-même. Deux types distincts sont compatibles s'ils vérifient au moins une des conditions suivantes :

  • Ces sont tous les deux des types réels.
  • Ce sont tous les deux des types entiers.
  • Un type est un intervalle de l'autre.
  • Les deux types sont des intervalles du même type.
  • Les deux sont des types ensemble dont les types de base sont compatibles.
  • Les deux sont des types chaîne compactée ayant le même nombre de caractères.
  • L'un est un type chaîne et l'autre est de type chaîne, chaîne compactée ou Char.
  • L'un est un type Variant et l'autre est de type entier, réel, chaîne, caractère ou booléen.
  • Les deux sont des type classe, référence de classe ou interface et un des types est dérivé de l'autre.
  • L'un des types est PAnsiChar ou PWideChar et l'autre est un tableau de caractères d'indice de base zéro de la forme array[0..n] of PAnsiChar ou PWideChar.
  • L'un des types est Pointer (un pointeur sans type) et l'autre est un type quelconque de pointeur.
  • Les deux types sont des pointeurs sur le même type et la directive de compilation {$T+} est activée.
  • Les deux sont des types procédure avec le même type de résultat, le même nombre de paramètres, et le même type de paramètre à la même position.

Compatibilité pour l'assignation

La compatibilité pour l'assignation n'est pas une relation symétrique. Une expression de type T2 peut être assignée à une variable de type T1 si la valeur de l'expression est dans l'étendue de T1 et si au moins une des conditions suivantes est vérifiée :

  • T1 et T2 sont du même type, et ce n'est pas un type fichier ou un type structuré contenant un type fichier à un niveau quelconque.
  • T1 et T2 sont des types scalaires compatibles.
  • T1 et T2 sont tous les deux des types réels.
  • T1 est un type réel et T2 un type entier.
  • T1 est de type PAnsiChar, PWideChar, PChar ou d'un type chaîne quelconque et l'expression est une constante chaîne.
  • T1 et T2 sont tous les deux des types chaîne.
  • T1 est un type chaîne et T2 est un Char ou un type chaîne compactée.
  • T1 est une chaîne longue et T2 est un PAnsiChar, PWideChar ou PChar.
  • T1 et T2 sont des types de chaîne compactée compatibles.
  • T1 et T2 sont des types ensemble compatibles.
  • T1 et T2 sont des types pointeur compatibles.
  • T1 et T2 sont tous les deux des types classe, référence de classe ou interface et T2 est dérivé de T1.
  • T1 est un type interface et T2 est un type de classe qui implémente T1.
  • T1 est un PAnsiChar ou un PWideChar et T2 est un tableau de caractères d'indice de base zéro de la forme array[0..n] of Char (lorsque T1 est un PAnsiChar) ou array[0..n] of WideChar (lorsque T1 est un PWideChar).
  • T1 et T2 sont des types procédure compatibles. Un identificateur de fonction ou de procédure est traité dans certaines instructions d'assignation comme une expression de type procédure. Voir "Types procédure dans les instructions et les expressions" présentée ci avant dans ce chapitre.
  • T1 est un Variant et T2 est un type entier, réel, chaîne, caractère, booléen, interface ou un type OleVariant.
  • T1 est un OleVariant et T2 est un type entier, réel, chaîne, caractère, booléen, interface ou un type Variant.
  • T1 est un type entier, réel, chaîne, caractère ou booléen et T2 est un Variant ou OleVariant.
  • T1 est le type interface IUnknown ou IDispatch et T2 est un Variant ou OleVariant. Le code de type du variant doit être varEmpty, varUnknown ou varDispatch si T1 est IUnknown, et varEmpty ou varDispatch si T1 est IDispatch.

Voir aussi