Kompatibilität und Identität von Typen (Object Pascal)

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Datentypen, Variablen und Konstanten - Index


Um zu verstehen, welche Operationen mit unterschiedlichen Ausdrücken durchgeführt werden können, müssen Ihnen die verschiedenen Arten der Kompatibilität zwischen Typen und Werten bekannt sein. Dies beinhaltet Folgendes:

  • Typidentität
  • Typkompatibilität
  • Zuweisungskompatibilität

Typidentität

Wenn ein Typbezeichner mit einem anderen Typbezeichner deklariert wird (ohne Qualifizierer), bezeichnen beide denselben Typ. In den Deklarationen:

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

sind T1, T2, T3, T4 und Integer identische Typen. Um unterschiedliche Typen zu definieren, wiederholen Sie das Wort type in der Deklaration. Beispiel:

type TMyInteger = type Integer;

Diese Anweisung erzeugt einen neuen Typ namens TMyInteger, der nicht mit Integer identisch ist.

Sprachkonstrukte, die als Typnamen fungieren, erzeugen bei jedem Auftreten einen anderen Typ. Die Typdeklarationen:

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

definieren beispielsweise die beiden unterschiedlichen Typen TS1 und TS2. Entsprechend werden mit den Variablendeklarationen

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

zwei Variablen unterschiedlichen Typs erzeugt. Um Variablen mit identischem Typ zu deklarieren, gehen Sie folgendermaßen vor:

var S1, S2: string[10];

oder

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

Typkompatibilität

Jeder Typ ist mit sich selbst kompatibel. Zwei verschiedene Typen sind kompatibel, wenn sie mindestens eine der folgenden Bedingungen erfüllen:

  • Beide Typen sind reelle Typen.
  • Beide Typen sind Integer-Typen.
  • Ein Typ ist ein Teilbereich des anderen.
  • Beide Typen sind Teilbereiche desselben Typs.
  • Beide Typen sind Mengentypen mit kompatiblen Basistypen.
  • Beide Typen sind gepackte String-Typen mit identischer Anzahl von Zeichen.
  • Ein Typ ist ein String-Typ, der andere ist ein String-Typ, ein gepackter String-Typ oder der Typ Char.
  • Ein Typ ist eine Variante (Typ Variant), der andere ein Integer-Typ, ein reeller Typ, ein String-Typ, ein Zeichentyp oder ein Boolescher Typ.
  • Beide Typen sind Klassentypen, Klassenreferenztypen oder Interface-Typen, wobei der eine Typ vom anderen abgeleitet ist.
  • Ein Typ ist PAnsiChar oder PWideChar und der andere ist ein nullbasiertes Zeichen-Array der Form array[0..n] of PAnsiChar oder PWideChar.
  • Ein Typ ist vom Typ Pointer (untypisierter Zeiger), der andere ist ein beliebiger Zeigertyp.
  • Beide Typen sind (typisierte) Zeiger auf denselben Typ, und die Compiler-Direktive {$T+} ist aktiviert.
  • Beide Typen sind prozedurale Typen mit identischem Ergebnistyp und identischer Parameteranzahl, wobei Parameter an derselben Position identische Typen haben müssen.

Zuweisungskompatibilität

Bei der Zuweisungskompatibilität handelt es sich nicht um ein symmetrisches Verhältnis. Ein Ausdruck des Typs T2 kann einer Variablen des Typs T1 zugewiesen werden, wenn der Ausdruck im Bereich von T1 liegt und mindestens eine der folgenden Bedingungen erfüllt ist:

  • T1 und T2 sind identische Typen, und beide sind weder ein Dateityp noch ein strukturierter Typ, der Dateikomponenten enthält.
  • T1 und T2 sind kompatible ordinale Typen.
  • T1 und T2 sind reelle Typen.
  • T1 ist ein reeller Typ, und T2 ist ein Integer-Typ.
  • T1 ist ein PAnsiChar, PWideChar, PChar oder ein String-Typ, und der Ausdruck ist eine String-Konstante.
  • T1 und T2 sind String-Typen.
  • T1 ist ein String-Typ, und T2 ist ein gepackter String-Typ oder ein Zeichentyp (Char)
  • T1 ist ein langer String, und T2 ist ein PAnsiChar, PWideChar oder PChar.
  • T1 und T2 sind kompatible gepackte String-Typen.
  • T1 und T2 sind kompatible Mengentypen.
  • T1 und T2 sind kompatible Zeigertypen.
  • T1 und T2 sind Klassentypen, Klassenreferenztypen oder Interface-Typen, wobei T2 von T1 abgeleitet ist.
  • T1 ist ein Interface-Typ, und T2 ist ein Klassentyp, der T1 implementiert.
  • T1 ist vom Typ PAnsiChar oder PWideChar, und T2 ist ein nullbasiertes Zeichen-Array der Form array[0..n] of Char (wenn T1 gleich PAnsiChar) oder of WideChar (wenn T1 gleich PWideChar).
  • T1 und T2 sind kompatible prozedurale Typen. Ein Funktions- oder Prozedurbezeichner wird in bestimmten Zuweisungsanweisungen als Ausdruck eines prozeduralen Typs behandelt.
  • T1 ist eine Variante (Typ Variant), und T2 ist ein Integer-Typ, ein reeller Typ, ein String-Typ, ein Zeichentyp, ein Boolescher Typ, ein Interface-Typ oder ein OleVariant-Typ.
  • T1 ist ein OleVariant-Typ, und T2 ist ein Integer-Typ, ein reeller Typ, ein String-Typ, ein Zeichentyp, ein Boolescher Typ, ein Interface-Typ oder eine Variante (Typ Variant).
  • T1 ist ein Integer-Typ, ein reeller Typ, ein String-Typ, ein Zeichentyp oder ein Boolescher Typ, und T2 ist eine Variante oder ein OleVariant-Typ.
  • T1 ist der Interface-Typ IUnknown oder IDispatch, und T2 ist ein Variant- oder OleVariant-Typ. (Die Variante muss den Typencode varEmpty, varUnknown oder varDispatch haben, wenn T1 IUnknown ist bzw. varEmpty oder varDispatch, wenn T1 IDispatch ist.)

Siehe auch