如何在Delphi中将单个枚举值标记为已弃用

Ive*_*aev 18 delphi enums deprecated delphi-xe2

我希望有以下内容:

TEnumType = (
  etValue1 = 1,
  etValue2 = 2 deprecated,
  etValue3 = 3);
Run Code Online (Sandbox Code Playgroud)

它返回:

[DCC Error] unt_CollectionImportType.pas(19): E2029 ',' or ')' expected 
but identifier 'deprecated' found.
Run Code Online (Sandbox Code Playgroud)

有没有办法指示编译器不推荐使用此值.

Zoë*_*son 35

type
  TEnumType = (
    etValue1 = 1,
    etDeprecated2 = 2, // was: etValue2; Renamed so we can deprecate it by name
    etValue3 = 3);

const
   etValue2 = etDeprecated2 deprecated; // Declares a constant mapped to the renamed enum value.
Run Code Online (Sandbox Code Playgroud)

  • @Rudy - 是的,但这是目标.将实际枚举值替换为不使用的名称,然后将现有(已弃用)枚举值声明为新名称的"别名",并将*alias*标记为已弃用.现有代码使用旧名称(别名),因此通过编译器的警告报告使用不推荐使用的值名称.这个答案完美地解决了这个问题,并且非常巧妙地解决了这个问题. (7认同)
  • +1,非常好.这是*答案*让我觉得我应该*提出更多问题*. (7认同)
  • 话虽如此,我会说如果不再使用该值,那么只需删除它或更改它的名称即可.然后,除了编译器警告之外,您会遇到编译器错误,除非您已经消除了所有使用已弃用的符号(这肯定是最终目标). (4认同)
  • +1虽然有警告:这将打破已弃用值的DFM流,因为DFM流将查看值的枚举类型,而不是const.因此,当您有一个包含值"etValue2"的现有DFM文件时,它将在读取该DFM文件时崩溃. (4认同)
  • @Deltics:只有在示例中给出值时才能这样做.当你依赖隐式枚举编号(即`TEnumType =(etZero,etOne,Two)`)时,你不能/不应该从列表中删除一个值,特别是当你在其他地方存储相应的数值时.然后重命名是唯一的选择.我同意不需要别名,但它肯定提供有用的警告,而不仅仅是关于未声明的标识符的错误消息. (2认同)