如何在泛型类中声明枚举类型的集合类型

5

我在 Delphi XE4 中发现了一些奇怪的行为。

如果在一个泛型类中声明枚举类型和这个类型相同的 set 类型就会出问题。

例如:

TTest<T> = class(TObject)
type
  TEnumType  = (eOne, eTwo, eThree);
  TEnumTypes = set of TEnumType;
end;

以上代码无法编译。编译器会出现错误信息“E2001: 需要序数类型”。
像这样的非泛型类,
TTest = class(TObject)
type
  TEnumType  = (eOne, eTwo, eThree);
  TEnumTypes = set of TEnumType;
end;

需要编译。

为了使通用类成功编译,序数类型必须在类外部声明:

TEnumType  = (eOne, eTwo, eThree);
TTest<T> = class(TObject)
type
  TEnumTypes = set of TEnumType;
end;

  1. 这种行为是否被认为是一个错误?如果是,它在后续版本中是否已经修复?
  2. 有人有其他的解决方法吗?我想在类中声明类型,因为它们仅在该类的私有部分中使用。

3
在西雅图工作没问题,我刚刚检查了一下。很可能是XE4编译器的问题。在XE4时代,我们遇到了许多关于通用类型的问题。 - Z.B.
1
@AndreiGalatyn,1. "但答案很明显,在最新版本的Delphi中可以编译这段代码而没有问题" - 如果OP使用的是XE4,那为什么这个答案会明显呢?2. 使用implementation部分是行不通的,因为OP需要在interface部分声明私有的TEnumType字段。 - kobik
1
@AndreiGalatyn,根据您的建议,如果我在Delphi7中遇到编译器错误,我需要安装所有免费/试用版本的Delphi,直到我(希望)成功编译我的程序,而不是在SO上询问或在网络上研究?就个人而言,我不会这样做... - kobik
1
我觉得很奇怪,我们都接受了这样一个事实:只有在新版本的编译器中才能修复错误,而不能在同一版本的更新中进行修复... - Remko
2
就我个人而言,每当你将一个嵌套类型放入一个泛型类型中时,请问自己:我是希望每个不同的封闭泛型类型都有一个不同的类型,还是它们实际上看起来都是一样的——就像这里的枚举一样。在我看来,只有当嵌套类型基于一个或多个类型参数时才有意义。如果你只是想将某些东西私有化,则考虑将非泛型基类添加为泛型类的祖先,可以在其中放置所有非泛型相关代码。 - Stefan Glienke
显示剩余2条评论
2个回答

5

这确实是一个在后续版本中已经修复的bug。例如,在XE7中,您的代码可以编译通过。很可能它也可以在XE5或XE6中编译,但我手头没有它们来进行检查。


4

请注意,QualityCentral现已关闭,因此您无法再访问qc.embarcadero.com链接。如果您需要访问旧的QC数据,请查看QCScraper - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接