CA2217:不要使用 FlagsAttribute 标记枚举

属性
规则 ID CA2217
标题 不要使用 FlagsAttribute 标记枚举
类别 使用情况
修复是中断修复还是非中断修复 非中断
在 .NET 9 中默认启用

原因

使用 FlagsAttribute 标记了枚举,并且它包含的一个或多个值不是 2 的幂或不是为该枚举定义的其他值的组合。

默认情况下,此规则仅查看外部可见的枚举,但这是可配置的。

规则说明

仅当枚举中定义的每个值都是 2 的幂或定义的值的组合时,枚举才应该具有 FlagsAttribute

如何解决冲突

若要解决与此规则的冲突,请从枚举中删除 FlagsAttribute

何时禁止显示警告

不禁止显示此规则发出的警告。

配置代码以进行分析

使用下面的选项来配置代码库的哪些部分要运行此规则。

可以仅为此规则、为适用的所有规则或为适用的此类别(使用情况)中的所有规则配置此选项。 有关详细信息,请参阅代码质量规则配置选项

包含特定的 API 图面

你可以根据代码库的可访问性,配置要针对其运行此规则的部分。 例如,若要指定规则应仅针对非公共 API 图面运行,请将以下键值对添加到项目中的 .editorconfig 文件:

dotnet_code_quality.CAXXXX.api_surface = private, internal

示例

以下代码演示了包含值 3 的枚举 Color。 3 不是 2 的幂,也不是任何定义的值的组合。 不应使用 FlagsAttribute 标记 Color 枚举。

// Violates this rule    
[FlagsAttribute]
public enum Color
{
    None = 0,
    Red = 1,
    Orange = 3,
    Yellow = 4
}
Imports System

Namespace Samples

    ' Violates this rule    
    <FlagsAttribute()> _
    Public Enum Color

        None = 0
        Red = 1
        Orange = 3
        Yellow = 4

    End Enum
End Namespace

以下代码演示了枚举 Days,该枚举满足使用 FlagsAttribute 进行标记的要求:

[FlagsAttribute]
public enum Days
{
    None = 0,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    All = Monday | Tuesday | Wednesday | Thursday | Friday
}
Imports System
Namespace Samples

    <FlagsAttribute()> _
    Public Enum Days

        None = 0
        Monday = 1
        Tuesday = 2
        Wednesday = 4
        Thursday = 8
        Friday = 16
        All = Monday Or Tuesday Or Wednesday Or Thursday Or Friday

    End Enum
End Namespace

CA1027:用 FlagsAttribute 标记枚举

另请参阅