WideChar 的集合:集合最多可以有 256 个元素

set of WideChar: Sets may have at most 256 elements

我有这条线:

const
  MY_SET: set of WideChar = [WideChar('A')..WideChar('Z')];

以上编译不通过,报错:

[Error] Sets may have at most 256 elements

但是这一行确实可以编译:

var WS: WideString;
if WS[1] in [WideChar('A')..WideChar('Z')] then...

这也可以编译:

const
  MY_SET = [WideChar('A')..WideChar('Z'), WideChar('a')..WideChar('z')];
  ...
  if WS[1] in MY_SET then...

这是为什么?

编辑: 我的问题是 为什么 if WS[1] in [WideChar('A')..WideChar('Z')] 编译?为什么 MY_SET = [WideChar('A')..WideChar('Z'), WideChar('a')..WideChar('z')]; 编译?他们不是也需要适用 set 规则吗?

一个集合不能超过 256 个元素。
即使元素很少,该集合也已使​​用 32 个字节。

来自文档:

A set is a bit array where each bit indicates whether an element is in the set or not. The maximum number of elements in a set is 256, so a set never occupies more than 32 bytes. The number of bytes occupied by a particular set is equal to

(Max div 8) - (Min div 8) + 1

因此,只有少于 257 个元素的字节集、(ansi)char、布尔值和枚举集是可能的。
因为 widechar 使用 2 个字节,所以它可以有 65536 个可能的值。
一组widechar占用8Kb,太大不实用

type
  Capitals = 'A'..'Z';

const
  MY_SET: set of Capitals = [WideChar('A')..WideChar('Z')];

编译和工作相同。

如果您的代码忽略 unicode,使用 widechar 似乎有点傻。
由于只识别英文大写字母,您没有考虑不同的语言环境。

在这种情况下,最好使用像

这样的代码
if (AWideChar >= 'A') and (AWideChar <= 'Z') ....

无论中间有多少个字符,这都有效。
显然你可以将它封装在一个函数中以节省输入。

如果您坚持要大集合,请参阅此答案:

一个有效的集合必须遵守两个规则:

  1. 集合中的每个元素的序数值必须小于 256。
  2. 集合中的元素不得超过 256 个。
MY_SET: set of WideChar = [WideChar('A')..WideChar('Z')];

这里你声明了一个集合类型 (Set of WideChar),它有超过 256 个元素 -> 编译器错误。

if WS[1] in [WideChar('A')..WideChar('Z')]

在这里,编译器将 WideChar('A') 视为序数值。该值和集合中的所有其他值均低于 256。这符合规则 1。

唯一元素的数量也在限制范围内(Ord('Z')-Ord('A')+1),因此第二条规则通过。

MY_SET = [WideChar('A')..WideChar('Z'), WideChar('a')..WideChar('z')];

在这里声明一个也满足上述要求的集合。请注意,编译器将其视为一组序数值,而不是 set of WideChar.