Delphi:如何拥有非连续的子范围枚举类型?

3

以下子范围枚举声明是有效的:

type
   TReceiptCode = 'A'..'F';

这不会:

type
   TReceiptCode = ' ','A'..'F', 'R';

也不会
type
    TReceiptCode = ' ','A','B','C','D','E','F','R';

如何声明一个非连续值的子范围类型?

3
你的最后一个例子不是子范围类型(与你问题标题相反)。你可以声明 TReceiptCode = (rcspace, rcA, rcB, rcC, rcD, rcE, rcF, rcR); ReceiptCodeStr : array of TReceiptCode = (' ', 'A', 'B', 'C', 'D', 'E', 'F', 'R'); - Argalatyr
Argalatyr的评论是完全正确的,他为您提供了一个完全可行的解决方案。所以没有必要冒犯别人。 - Despatcher
3个回答

5
你可以使用一个集合代替吗?
TSomeCharSet= Set of Char;

SomeChars: TSomeCharSet = [' ','A','B','C','D','E','F','R'];

可能是奶奶和蛋的情况,但我不确定你用它来做什么 :) ...

那么你所剩下的就是使用一个集合或数组来创建TNonContigousCharRange作为限制的“范围”,并在超出范围时引发异常,或者编写一个SetReceiptCode程序来执行类似的操作。


当前定义了一个类型为Char。我希望限制可以赋给该类型的字符的值。 - Ian Boyd
哦,不,集合是不行的,因为它接受的是一组值,而不是单个值。 - Ian Boyd
集合确实有效,只是编译器不会自动进行值检查,您必须自己测试该集合中的成员资格,但它确实为您提供了实现这一点所需的数据结构。 - Deltics

5

很遗憾,我认为没有办法做到这一点。您可以声明一个(新的)非连续枚举或现有类型的子范围,但不能同时声明两者。


在过去的4个月中,没有人提出解决方案,所以我猜确实没有。接受。 - Ian Boyd

3
我想补充之前所有答案的内容,关键在于类型名称中的提示:subrange。
简单来说,范围有一个下限和一个上限。你描述的是一个集合(或子集),而不是子范围,因此你当然无法将其表达为子范围。

当然,你是对的。我认为适用的术语是“矛盾修辞法”,它不是贬义词,而只是描述了一个包含矛盾术语的短语。 - Argalatyr
不要忘记,我正在“编造”一个术语,因为我不知道Delphi中我尝试做的事情的“正确”术语。结果发现Delphi无法实现我的愿望,因此没有“官方”术语-因此我的虚构术语是有效的。有人可以自由地发明另一个名称来实现我想要的目标。 - Ian Boyd
1
你没有理解重点: 问:“为什么这个子范围声明不起作用?” 答:“因为它不是子范围。它是其他东西。” 是的,你是正确的,你需要的“其他东西”在Delphi中不存在。但这并不意味着你使用“子范围”这个术语来描述它是有效的,最少不适用于你尝试实现的内容(这是一个“集合”),而“子范围”在Delphi中确实有意义。 - Deltics

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