我有一个要用枚举集注释的类。

我定义了自定义属性类以及所有内容。我想在资源文件中的其他位置定义枚举集,然后仅将注释与此预定义的枚举集一起应用。但是,编译器抱怨它期望一个常量表达式(尽管枚举集是在const块中定义的)

然后,如果我传入一个硬编码的枚举集,它不会抱怨。

为什么不编译?我如何在另一个资源文件中定义枚举集并在批注中使用它们,而不必在批注中对其进行硬编码?

// resources.pas

interface

type

TMyEnum = (val1, val2, val3);

TEnumSet = set of TMyEnum;

const enumSet1 : TEnumSet = [val1, val2];

// Class.pas

interface

uses resources;

type

TMyAnnotation = class(TCustomAttribute)
begin
public
constructor Create(const aSet : TEnumSet);
end;

[TMyAnnotation(enumSet1)] // Fail, Constant expression expected here!
TMyClass = class(TObject)
begin
end;

[TMyAnnotation([val1, val2])] // Compiles
TMyClass = class(TObject)
begin
end;

最佳答案

根据语言的规则,类型化常量不是constant expression,必须将属性构造函数传递给constant expressions

您已经声明了类型常量。改用常量表达式:

const enumSet1 = [val1, val2];

09-27 20:21