以下代码无法编译,并显示 [dcc32 Error] TestDefaultParameterValuePrj.dpr(13):E2026 预期常量表达式:
program TestDefaultParameterValuePrj;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
const
SomeValue: char = 'T';
function Test(p1: String; p2: char = SomeValue): String;
begin
Result := p2;
end;
begin
try
Writeln(Test('Blah Blah'));
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Run Code Online (Sandbox Code Playgroud)
基于这个线程,如果我真的想使用常量,我可以使用重载函数。但是,我很惊讶编译器不接受它。
从文档中,我的重点是:
您可以在过程或函数标题中指定默认参数值。只有类型化的 const 和值参数才允许使用默认值。要提供默认值,请使用 = 符号后跟一个与参数类型赋值兼容常量表达式。
类型化常量不是常量表达式。将您的常量声明为真正的常量,它是一个常量表达式:
const
SomeValue = 'T';
Run Code Online (Sandbox Code Playgroud)
真正常量、类型常量和常量表达式的一些棘手问题在这里涵盖: Declared Constants。一些关键摘录:
常量表达式是编译器可以在不执行它所在的程序的情况下对其进行评估的表达式。常量表达式包括数字;字符串;真正的常数;枚举类型的值;特殊常量 True、False 和 nil;和表达式完全从这些元素使用运算符、类型转换和集合构造函数构建。
....
Delphi 语法规范中的多个地方使用了常量表达式的这种定义。初始化全局变量、定义子范围类型、为枚举类型中的值分配序数、指定默认参数值、编写 case 语句以及声明真常量和类型常量都需要常量表达式。
....
与真正的常量不同,类型化常量可以保存数组、记录、过程和指针类型的值。类型常量不能出现在常量表达式中。
| 归档时间: |
|
| 查看次数: |
876 次 |
| 最近记录: |