是否可以使用默认参数创建一个过程,该过程是一个元类?

时间:2017-05-24 21:03:50

标签: delphi

此代码:

type
  TMyClass = class(TObject);

procedure Foo(AClass: TClass = TMyClass);
begin
end;

结果:

  

[dcc32错误] E2026预期的常量表达式

是否可以使用默认参数创建一个过程,该过程是一个元类?

1 个答案:

答案 0 :(得分:0)

来自documentation,强调:

  

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

那么,什么是常量表达式?这包括在内:Declared Constants。一些关键摘录:

  

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

     

...

     

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

     

...

     

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

因此,不可能将元类声明为常量表达式。这意味着你想要做的事情是不可能的。

解决方法是使用过程重载:

type
  TMyClass = class(TObject);

procedure Foo(AClass: TClass); overload;
begin
end;

procedure Foo; overload;
begin
  Foo(TMyClass);
end;