根据CA1008规则,FXCop Enums的默认值应为零.这适用于C#吗?

Kar*_*gal 1 c# enums fxcop

该规则是否适用于C#?

如果我们尝试使用枚举而不显式设置值,编译器会给出错误"使用未分配的局部变量"?

要求的视角是FxCop规则的有效性,因为我不能使用枚举的默认值.

public enum TraceLevel
{
    Off = 0,
    Error = 1,
    Warning = 2,
    Info = 3,
    Verbose = 4
}

class Program
{
    static void Main(string[] args)
    {
        TraceLevel traceLevelOptions;
        Console.WriteLine(traceLevelOptions.ToString());
        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

获得正确答案后更新.以下代码应该有效:

public class SerializeMe
{
    public int Id { get; set; }
    public TraceLevel MyTrace { get; set; }
}

public enum TraceLevel
{
    Off = 0,
    Error = 1,
    Warning = 2,
    Info = 3,
    Verbose = 4
}

class Program
{
    static void Main(string[] args)
    {
        SerializeMe serializeMe = new SerializeMe();
        Console.WriteLine(serializeMe.MyTrace.ToString());
        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*son 5

枚举应该具有零值的原因在与其相关的代码分析错误的文档中进行了解释:

http://msdn.microsoft.com/en-us/library/ms182149.aspx

CA1008:枚举值应为零

与其他值类型一样,未初始化枚举的默认值为零.非标志属性枚举应定义值为零的成员,以便默认值为枚举的有效值.

因此,原因是,例如,如果在类或结构中声明枚举字段并且不对其进行初始化,则它将具有默认值零.如果没有枚举的成员具有零值,则您将在该(相当常见的)情况下具有包含无效值的枚举字段.

还有一些其他情况可以使用默认初始化的枚举字段(例如在反序列化期间).您希望避免默认初始化的枚举字段具有无效值,因此规则.