型の互換性と同一性(Delphi)
データ型、変数、定数:インデックス への移動
どの式でどの操作が実行されるのかを理解するために、型や値の間にあるいくつかの種類の互換性を識別する必要があります。 選択肢には、以下のものがあります。
- 型の同一性
- 型の互換性
- 代入の互換性
型の同一性
型識別子が他の型識別子を限定せずに使用して宣言される場合、それらは同一の型であることを意味します。 たとえば、次のように宣言されているとします。
type T1 = Integer; T2 = T1; T3 = Integer; T4 = T2;
T1、T2、T3、T4、および Integer は、すべて同一の型であることを意味します。 別個の型を作成するには、宣言で予約語 type を繰り返します。 例:
type TMyInteger = type Integer;
これは、Integer と同一ではない TMyInteger という新しい型を作成します。
型名として機能する言語構文は、それらが出現するたびに異なる型を表します。 たとえば、次のように宣言されているとします。
type TS1 = set of Char; TS2 = set of Char;
これは、TS1 と TS2 という 2 つの別個の型を作成します。 同様に、次のように変数が宣言されているとします。
var S1: string[10]; S2: string[10];
これは、別個の変数の型を 2 つ作成します。 同一の型の変数を作成するには、以下のようにします。
var S1, S2: string[10];
または:
type MyString = string[10]; var S1: MyString; S2: MyString;
型の互換性
すべての型は、それ自体と互換性があります。 以下の条件を少なくとも 1 つ満たす場合、2 つの別個の型には互換性があります。
- 両方とも実数型である。
- 両方とも整数型である。
- 一方の型が、他方の型の部分範囲である。
- 両方の型が、同一の型の部分範囲である。
- 両方とも、互換性のある基底型を基に設定されている。
- 両方とも、同一の文字数のパック文字列型である。
- 一方が文字列型で、他方が文字列型、パック文字列型、または Char 型である。
- 一方がバリアント型で、他方が整数型、実数型、文字列型、文字型、または論理型である。
- 両方ともクラス型、クラス参照型、またはインターフェイス型で、一方が他方の型から派生した型である。
- 一方が PAnsiChar または PWideChar で、他方が PAnsiChar または PWideChar の array[0..n] という形式のインデックスが 0 から始まる文字配列である。
- 一方が Pointer(型なしポインタ)で、他方が何らかのポインタ型である。
- 両方とも同一の型への(型付き)ポインタで、{$T+} コンパイラ指令が有効である。
- 両方とも手続き型で、結果の型が同一で、パラメータの数とパラメータの対応する位置の型が同一である。
代入の互換性
代入の互換性は、対称的な関係ではありません。 式の値が T1 の範囲に納まり、以下の条件の少なくとも 1 つを満たす場合、型 T2 の式は、型 T1 の変数に代入されます。
- T1 と T2 が同一の型で、いずれかのレベルにファイル型を含むファイル型または構造化型ではない。
- T1 と T2 が、互換性のある順序型である。
- T1 と T2 が、両方とも実数型である。
- T1 が実数型で、T2 が整数型である。
- T1 が PAnsiChar、PWideChar、PChar、または何らかの文字列型で、式が文字列定数である。
- T1 と T2 が、両方とも文字列型である。
- T1 が文字列型で、T2 が Char またはパック文字列型である。
- T1 が長い文字列で、T2 が PAnsiChar、PWideChar、または PChar である。
- T1 と T2 が、互換性のあるパック文字列型である。
- T1 と T2 が、互換性のある集合型である。
- T1 と T2 が、互換性のあるポインタ型である。
- T1 と T2 が、両方ともクラス型、クラス参照型、またはインターフェイス型で、T2 が T1 から派生している。
- T1 がインターフェイス型で、T2 が T1 を実装したクラス型である。
- T1 が PAnsiChar または PWideChar で、T2 が array[0..n] of Char という形式(T1 が PAnsiChar の場合)または WideChar(T1 が PWideChar の場合)のインデックスが 0 から始まる文字配列である。
- T1 と T2 が、互換性のある手続き型である。 (特定の代入文では、関数または手続き識別子は、手続き型の式として扱われます。 「手続き型」トピックの「文と式の中の手続き型」セクションを参照。)
- T1 がバリアント型で、T2 が、整数型、実数型、文字列型、文字型、Boolean 型、インターフェイス型、または OleVariant 型である。
- T1 が OleVariant 型で、T2 が、整数型、実数型、文字列型、文字型、Boolean 型、インターフェイス型、またはバリアント型である。
- T1 が、整数型、実数型、文字列型、文字型、論理型で、T2 が、バリアント型、または OleVariant 型である。
- T1 が、IUnknown または IDispatch インターフェイス型で、T2 が、バリアント型または OleVariant 型である。 (バリアントの型コードは、T1 が IUnknown の場合、varEmpty、varUnknown、または varDispatch、T1 が IDispatch の場合は、varEmpty または varDispatch でなければなりません)