E2008 Inkompatible Typen (Delphi)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Fehler- und Warnungsmeldungen (Delphi)

Diese Fehlermeldung wird angezeigt, wenn der Compiler zwei kompatible (sehr ähnliche) Typen erwartet, die Typen aber tatsächlich unterschiedlich sind. Dieser Fehler kann in sehr unterschiedlichen Situationen auftreten – beispielsweise, wenn eine Read- oder Write-Klausel in einer Eigenschaft eine Methode enthält, deren Parameterliste nicht mit der Eigenschaft übereinstimmt, oder wenn ein Parameter für eine Standardprozedur oder -methode den falschen Typ hat.

Dieser Fehler kann auch auftreten, wenn in zwei Units jeweils ein Typ mit demselben Namen deklariert wird. Diese Fehlermeldung kann zudem angezeigt werden, wenn eine Prozedur aus einer importierten Unit einen Parameter mit einem gleichnamigen Typ enthält, und eine Variable eines gleichnamigen Typs an die Prozedur übergeben wird.


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.

Die Standardfunktion Hi erwartet ein Argument des Typs Integer oder Word, stattdessen wird ein Array verwendet. In dem Aufruf von ExportedProcedure ist V vom Typ unit1.ExportedType, da unit1 vorher in unit2 importiert wurde. Daher tritt ein Fehler auf.


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.

Eigentlich sollte die Standardfunktion High und nicht Hi verwendet werden. Für den Aufruf von ExportedProcedure gibt es zwei alternative Lösungen. Erstens könnten Sie die Reihenfolge der uses-Klausel ändern. Dies könnte aber zu ähnlichen Fehlern führen. Eine robustere Lösung ist, den Typennamen voll mit der Unit, die den gewünschten Typ deklariert, zu qualifizieren, wie es In diesem Beispiel für die Deklaration von V vorgenommen wurde.