CA1008:枚举应具有零值和标志枚举

时间:2014-03-27 14:39:48

标签: c# .net enums fxcop enum-flags

即使我完全了解CA1008警告存在的原因,我也不知道在以下情况下如何避免它。我有一个具有以下含义的Flag枚举:

ValidValue = 0x01
WrittenValue = 0x02

所以在这种情况下,0表示InvalidValueNonWritten而不是None。规则says

  

请勿禁止此规则发出警告,但先前已发送的标记属性枚举除外。

在这种情况下,我没有发送枚举,所以如何防止此警告?

修改

警告明确地说:

  

警告86 CA1008:Microsoft.Design:在枚举' XXX'中,更改' XXX.InvalidValueNonWritten'的名称。到'无'。

编辑2:

枚举的更多状态:

CommandValue = 0x04 // Otherwise it is DataValue
InmediateValue = 0x08 // Otherwise it is Deferred

2 个答案:

答案 0 :(得分:5)

在此特定时刻,0值具有“无效或无效”的含义。但是,如果添加更多枚举成员,则不再是这种情况。例如,如果添加ApprovedValue = 0x04,则0将开始表示“无效或已写入或已批准”。这是始终使用None名称作为0值的主要原因。

如果None作为名称没有意义,这通常表示枚举设计或名称中的缺陷。在你的情况下,它听起来像枚举实际上表示值已经通过的步骤,而不是值的状态(标志枚举通常不会使用)。可能以下是您想要的更近的表示(关联类可能具有名为CompletedValueProcessingSteps的属性)?

[Flags]
enum ValueProcessingSteps
{
    None = 0,
    Validation = 1,
    Writing = 2
}

答案 1 :(得分:0)

如果0表示InvalidValueNonWritten,则将InvalidValueNonWritten添加到枚举中。然后这个警告不会发生。如果你真的不应该在你的枚举中使用0来抑制代码中的警告并确保你将理由放入以备将来参考。

如果由于0无效而期待异常,最好使用枚举在您的方法中执行验证。此外,这对于序列化更好,例如,如果您在模型上使用序列化,模型将使用源中缺少的成员反序列化。