为什么编译器会拒绝一个常量默认参数值“E2026 Constant expression expected”?

时间:2016-01-15 19:25:05

标签: delphi

以下代码无法使用[dcc32错误] 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.

基于这个thread我可以使用重载函数,如果我真的想使用常量。但是,我很惊讶编译器不接受它。

1 个答案:

答案 0 :(得分:4)

来自documentation,强调:

  

您可以在过程或函数标题中指定默认参数值。仅对类型化的const和value参数允许使用默认值。要提供默认值,请使用=符号结束参数声明,然后使用与参数类型分配兼容的常量表达式

类型化常量不是常量表达式。将你的常量声明为一个常数表达式的真常量:

const
  SomeValue = 'T';

真正的常量,类型常量和常量表达式这个棘手的问题在这里讨论:Declared Constants。一些关键摘录:

  

常量表达式是编译器可以在不执行其发生的程序的情况下进行求值的表达式。常量表达式包括数字;字符串;真常数;枚举类型的值;特殊常量True,False和nil;和表达式由这些元素专门构建,包含运算符,类型转换和集合构造函数。

     

...

     

这个常量表达式的定义在Delphi的语法规范中的几个地方使用。初始化全局变量,定义子范围类型,为枚举类型中的值指定顺序,指定默认参数值,编写case语句以及声明true和typed常量都需要常量表达式。

     

...

     

与常量不同,类型常量可以包含数组,记录,过程和指针类型的值。类型常量不能出现在常量表达式中。