E2008 Types incompatibles (Delphi)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Messages d'erreur et d'avertissement (Delphi)

Ce message d'erreur survient lorsque le compilateur attend que deux types soient compatibles (c'est-à-dire très semblables), mais en fait, ils deviennent différents. Cette erreur est produite dans différentes situations - par exemple lorsqu'une clause read ou write d'une propriété mentionne une méthode dont la liste de paramètres ne correspond pas à la propriété, ou lorsqu'un paramètre d'une procédure ou fonction standard est d'un type incorrect.

Cette erreur peut aussi se produire lorsque deux unités déclarent un type de même nom. Lorsqu'une procédure d'une unité importée a un paramètre dont le nom de type est identique, et qu'une variable de même nom de type est transmise à la procédure, l'erreur peut se produire.


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.

La fonction standard Hi attend un argument de type Integer ou Word, mais nous avons fourni un tableau à la place. Dans l'appel à ExportedProcedure, V est actuellement de type unit1.ExportedType puisque unit1 est importée avant unit2, une erreur peut ainsi se produire.


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.

Nous voulons réellement utiliser la fonction standard High, et non Hi. Pour l'appel de ExportedProcedure, il existe deux autres solutions. Pour la première, vous pouvez modifier l'ordre de la clause uses, mais cela pourrait aussi provoquer des erreurs similaires. Une solution plus solide est de qualifier entièrement le nom de type avec l'unité qui a déclaré le type désiré, comme ce qui a été fait dans la déclaration de V ci-dessus.