Delphi如何用积分参数解析重载函数?
|
考虑以下程序:
program IntegerOverloads;
{$APPTYPE CONSOLE}
procedure WordOrCardinal(Value: Word); overload;
begin
Writeln('Word');
end;
procedure WordOrCardinal(Value: Cardinal); overload;
begin
Writeln('Cardinal');
end;
procedure SmallintOrInteger(Value: Smallint); overload;
begin
Writeln('Smallint');
end;
procedure SmallintOrInteger(Value: Integer); overload;
begin
Writeln('Integer');
end;
procedure ShortintOrSmallint(Value: Shortint); overload;
begin
Writeln('Shortint');
end;
procedure ShortintOrSmallint(Value: Smallint); overload;
begin
Writeln('Smallint');
end;
procedure Main;
var
_integer: Integer;
_cardinal: Cardinal;
_word: Word;
begin
WordOrCardinal(_Integer);
SmallintOrInteger(_cardinal);
ShortintOrSmallint(_word);
end;
begin
Main;
Readln;
end.
XE2编译时的输出是: Cardinal Integer Smallint Delphi 6编译时的输出是: Word Smallint Shortint documentation州(强调我的):
但这似乎在这里适用。示例代码中的任何过程调用都不接受调用调用中实际参数的类型。 我找不到任何描述编译器遵循的规则的文档。任何人都可以指出这样的文件? 这个问题是由以下文章提示的: > ReverseBytes() 更新 由Ken White的评论提出,我写了另一个程序来说明一些更多的怪物: program IntegerOverloadsPart2;
{$APPTYPE CONSOLE}
procedure Test(Value: Byte); overload;
begin
Writeln('Byte');
end;
procedure Test(Value: Word); overload;
begin
Writeln('Word');
end;
procedure Test(Value: Cardinal); overload;
begin
Writeln('Cardinal');
end;
procedure Test(Value: Uint64); overload;
begin
Writeln('Uint64');
end;
procedure Main;
var
_byte: Byte;
_shortint: Shortint;
_word: Word;
_smallint: Smallint;
_cardinal: Cardinal;
_integer: Integer;
_uint64: UInt64;
_int64: Int64;
begin
Writeln('Unsigned variables passed as parameters:');
Test(_byte);
Test(_word);
Test(_cardinal);
Test(_uint64);
Writeln;
Writeln('Signed variables passed as parameters:');
Test(_shortint);
Test(_smallint);
Test(_integer);
Test(_int64);
end;
begin
Main;
Readln;
end.
当由XE2编译时,输出为: Unsigned variables passed as parameters: Byte Word Cardinal Uint64 Signed variables passed as parameters: Uint64 Uint64 Uint64 Uint64 在Delphi 6中,我必须删除UInt64重载,因为Delphi 6中不存在该类型,输出是: Unsigned variables passed as parameters: Byte Word Cardinal Signed variables passed as parameters: Byte Byte Byte 两种行为看起来都不符合以下声明:
解决方法
无符号类型都可以容纳有符号的类型;引用的文档与您的示例是一致的 – 它对编译器将如何对待它们一点也不说。另一方面,签名类型可以容纳一个无符号类型(SmallInt可以容纳字节,LongInt可容纳Word,Int64包含Cardinal):
program IntegerOverloadsPart3;
{$APPTYPE CONSOLE}
procedure Test(Value: ShortInt); overload;
begin
Writeln('Short');
end;
procedure Test(Value: SmallInt); overload;
begin
Writeln('Small');
end;
procedure Test(Value: LongInt); overload;
begin
Writeln('Long');
end;
procedure Test(Value: Int64); overload;
begin
Writeln('64');
end;
procedure Main;
var
_byte: Byte;
_word: Word;
_cardinal: Cardinal;
_uint64: UInt64;
begin
Writeln('Unsigned variables passed as parameters:');
Test(_byte);
Test(_word);
Test(_cardinal);
Test(_uint64);
Writeln;
end;
begin
Main;
Readln;
end.
Delphi XE输出: Small Long 64 64 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
