根据 CA1008 规则,FXCop 枚举的默认值应为零.这是否适用于 C#

本文关键字:是否 适用于 默认值 规则 CA1008 FXCop 枚举 根据 | 更新日期: 2023-09-27 18:31:23

此规则是否应适用于 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();
    }
}

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

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();
    }
}

根据 CA1008 规则,FXCop 枚举的默认值应为零.这是否适用于 C#

枚举应

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

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

CA1008:枚举值应为零

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

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

还有其他情况下,您最终可能会得到默认初始化的枚举字段(例如,在反序列化期间)。您希望避免默认初始化的枚举字段具有无效值,因此规则。

这不是 FXCop 错误,而是 C# 编译器错误。在 C# 中,所有局部变量在使用之前都必须初始化。

TraceLevel traceLevelOptions = 0; // or TraceLevel.Error for example

像所有其他类型的一样...如果traceLevelOptionsint,你会得到同样的错误。

struct类型存在漏洞。您可以为其分配值或为其所有字段分配值,它们将被视为已分配。请注意,如果struct具有例如private字段,则有时无法满足此条件。