Delphi 具有扩展类型结果的类运算符在BDS2006中不起作用?
如果我尝试编译以下代码,我会在最后一行(E:=R)收到一条错误消息“E2010不兼容类型:'Extended'和'TMyRec'”:Delphi 具有扩展类型结果的类运算符在BDS2006中不起作用?,delphi,operator-overloading,delphi-2006,Delphi,Operator Overloading,Delphi 2006,如果我尝试编译以下代码,我会在最后一行(E:=R)收到一条错误消息“E2010不兼容类型:'Extended'和'TMyRec'”: 我请一位朋友尝试用XE编译它——编译成功了。那么这是BDS2006中的一个bug吗?有没有办法解决这个问题?这确实是编译器的缺陷。修复该缺陷的唯一方法是升级到解决该缺陷的编译器版本。如果您不能做到这一点,您只需要以不同的方式编写代码 FWIW,在我看来,使用Extended总是一个错误。此类型是非标准的,仅存在于x86上。在将来的某个时候,如果您移动到x64,您会
我请一位朋友尝试用XE编译它——编译成功了。那么这是BDS2006中的一个bug吗?有没有办法解决这个问题?这确实是编译器的缺陷。修复该缺陷的唯一方法是升级到解决该缺陷的编译器版本。如果您不能做到这一点,您只需要以不同的方式编写代码
FWIW,在我看来,使用
Extended
总是一个错误。此类型是非标准的,仅存在于x86上。在将来的某个时候,如果您移动到x64,您会发现Extended
映射到Double
。此外,该类型的对齐会导致内存访问性能差,将数据存储为扩展而不是双的程序往往会明显较慢。还感谢您提供有关扩展的额外信息。无论如何,在这种情况下,确切的类型是不相关的,因为编译器在选择任何实际类型时失败。
type
TMyRec = record
class operator Implicit(Rec: TMyRec) : Integer;
class operator Implicit(Rec: TMyRec) : Extended;
end;
class operator TMyRec.Implicit(Rec: TMyRec) : Integer;
begin
Result := 1;
end;
class operator TMyRec.Implicit(Rec: TMyRec) : Extended;
begin
Result := 1;
end;
var
R : TMyRec;
B : Byte;
E : Extended;
begin
B := R; //this is OK
E := R; //E2010 Incompatible types: 'Extended' and 'TMyRec'
end.