【问题标题】:Is it possible to create a procedure with a default parameter which is a metaclass?是否可以使用元类的默认参数创建一个过程?
【发布时间】:2017-05-24 21:03:49
【问题描述】:

这段代码:

type
  TMyClass = class(TObject);

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

结果:

[dcc32 错误] E2026 需要常量表达式

是否可以使用元类的默认参数创建过程?

【问题讨论】:

    标签: delphi


    【解决方案1】:

    来自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;
    

    【讨论】:

    • 谢谢大卫。那就超载吧!
    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 2020-06-28
    • 1970-01-01
    • 2022-11-10
    • 2018-02-11
    • 2019-09-22
    • 1970-01-01
    • 2011-08-16
    相关资源
    最近更新 更多