E2008 互換性のない型です (Delphi)
エラーと警告のメッセージ(Delphi) への移動
このエラーメッセージは,コンパイラは 2 つの型が互換(非常に近い型)であることを想定しているのに,実際には異なる型であったときに表示されます。このエラーはさまざまな場合に発生します。たとえば,プロパティ内の read 節か write 節で指定したメソッドのパラメータリストがそのプロパティに適合しない場合や,標準手続きまたは標準関数へのパラメータの型が誤っている場合などです。
このエラーは,2 つのユニットで同じ名前の型が宣言されている場合にも発生します。たとえば,インポートされたユニット内の手続きのパラメータの型の名前が,インポート先で宣言されている型の名前と同じで,同じ名前の型の変数がその手続きに渡された場合にも,このエラーが発生します。
unit unit1; interface type ExportedType = (alpha, beta, gamma); implementation begin end. unit unit2; interface type ExportedType = (alpha, beta, gamma); procedure ExportedProcedure(v : ExportedType); implementation procedure ExportedProcedure(v : ExportedType); begin end; begin end. program Produce; uses unit1, unit2; var A: array [0..9] of char; I: Integer; V : ExportedType; begin ExportedProcedure(v); I:= Hi(A); end.
{ 標準関数 Hi には整数型またはワード型の引数が必要だが,ここでは配列型の引数を指定している。ExportedProcedure の呼び出しの場合では,unit1 が unit2 より後にインポートされているので,V の型は実際には unit1.ExportedType となり,エラーが発生する }
unit unit1; interface type ExportedType = (alpha, beta, gamma); implementation begin end. unit unit2; interface type ExportedType = (alpha, beta, gamma); procedure ExportedProcedure(v : ExportedType); implementation procedure ExportedProcedure(v : ExportedType); begin end; begin end. program Solve; uses unit1, unit2; var A: array [0..9] of char; I: Integer; V : unit2.ExportedType; begin ExportedProcedure(v); I:= High(A); end.
{ ほんとうは Hi でなく標準関数 High を使用するつもりだった。ExportedProcedure の呼び出しについては 2 とおりの解決方法がある。1 つは uses 節の順序を入れ替えることだが,それでも同様のエラーが発生する可能性がある。より確実な解決策は,下の例の V のように,型名が宣言されたユニット名を使って問題の型を完全に修飾すること }